要求是搜索文本块中的部分短语。大多数单词都是标准长度。我想将max_gram值保持为10.但偶尔的id /代码可能会包含更多的字符,如果我输入前10个字符匹配的查询,则会显示这些,但其余的不会
例如,这是映射:
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"autocomplete": {
"tokenizer": "autocomplete",
"filter": [
"lowercase"
]
}
},
"tokenizer": {
"autocomplete": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 10,
"token_chars": [
"letter"
]
}
}
}
},
"mappings": {
"doc": {
"properties": {
"title": {
"type": "text",
"analyzer": "autocomplete"
}
}
}
}
}
和文件:
POST my_index/doc/1
{
"title": "Quick fox with id of ABCDEFGHIJKLMNOP"
}
如果我运行查询:
POST my_index/doc/_search
{
"query": {
"match_phrase": {
"title": {
"query": "fox wi"
}
}
}
}
按预期返回文档。但是,如果我运行这个:
POST my_index/doc/_search
{
"query": {
"match_phrase": {
"title": {
"query": "ABCDEFGHIJxxx"
}
}
}
}
它还会返回文档。如果x在第10个字符之后但不在它之前,它将执行此操作。我怎么能避免这个?
我正在使用第5版。
答案 0 :(得分:0)
默认情况下,在索引时使用的分析器与搜索时使用的分析器相同,这意味着edge_ngram分析器将用于您的搜索词。这不是你想要的。最终会有10个令牌作为搜索词,其中没有一个包含最后3个字符。
您需要查看映射的Search Analyzer。本文档指出了这个特定的用例:
但有时,在搜索时使用不同的分析器是有意义的,例如在使用edge_ngram标记生成器进行自动完成时。
标准分析仪可能符合您的需求:
{
...
"mappings": {
"doc": {
"properties": {
"title": {
"type": "text",
"analyzer": "autocomplete",
"search_analyzer": "standard"
}
}
}
}
}