在笔记本电脑上通常有一个"typename",例如。
联想T430
联想T430P
联想T430S

麻生

用户希望在搜索T430时找到T430的所有变体

但是Elasticsearch中的标准分析器基于空间/非字母数字的aso进行标记。

因此,搜索T430将仅返回T430变体,而不会返回其他变体。

解决此问题的最佳方法是什么?我已经考虑过这些解决方案

  • 检测到用户正在搜索产品类型,并将搜索转换为通配符搜索,例如。 T430 *-这很难扩展
  • 使分析器能够了解不同类型的产品类型,并可以从T430S构造一个T430 token
  • 最佳答案

    您可以使用prefix query比通配符查询执行得更好。
    为此,您需要不对字段进行如下分析

    "type_name": {"type": "string", "index": "not_analyzed"}
    

    另一种方法是使用edge ngram tokenizer,这可能会增加索引大小,但会提供更好的性能。

    您可以如下定义自定义分析器
    {
        "settings" : {
            "analysis" : {
                "analyzer" : {
                    "my_analyzer" : {
                        "tokenizer" : "customedgeNgram"
                    }
                },
                "tokenizer" : {
                    "customedgeNgram" : {
                        "type" : "edgeNGram",
                        "min_gram" : "3",
                        "max_gram" : "10"
                    }
                }
            }
        }
    }
    

    您需要根据需要更改min_grammax_gram值。并在您的 Realm 中用作
    "type_name": {"type": "string", "analyzer": "my_analyzer"}
    

    现在,您可以在字段type_name上使用简单术语查询

    10-07 17:07