在 Elastic 5.4 中选择正确的 Tokenizer 以模拟包含类似查询
Choosing right Tokenizer in Elastic 5.4 for emulate contains like queries
我正在使用 Elastic 5.4 来实现建议/完成之类的功能,并且在根据我的要求选择正确的分词器时面临问题。下面是示例:
索引中有4篇文献,内容如下:
文档 1:掌声
文档 2:苹果
文档 3:这是一个苹果
文档 4:应用程序
文档 5:有 is_an_appl
查询
查询 1:查询字符串“App”应该 return 所有 5 个文档。
查询 2:查询字符串“Apple”应该 return 仅文档 2 和文档 3。
查询 3:查询字符串“Applications”应该 return 仅记录 4.
查询 4:查询字符串“appl”应该 return 所有 5 个文档。
分词器
我在 Elastic 中使用以下分词器,我看到所有文档 return 为查询 2 和查询 3 编辑。
分析器应用于“text”类型的字段。
"settings": {
"analysis": {
"analyzer": {
"my_ngram_analyzer": {
"tokenizer": "my_ngram_tokenizer"
}
},
"tokenizer": {
"my_ngram_tokenizer": {
"type": "ngram",
"min_gram": "3",
"max_gram": "3",
"token_chars": [
"letter",
"digit"
]
}
}
}
}
如何将结果限制为 return 个文档,这些文档包含与查询字符串完全匹配的内容,无论是作为现有单词、短语还是精确单词的一部分(我已经提到了上述查询中提供了预期结果)?
那是因为您使用的是 nGram
tokenizer instead of edgeNGram
。后者仅索引前缀,而前者将索引前缀、后缀以及数据的子部分。
将您的分析器定义更改为此,它应该会按预期工作:
"settings": {
"analysis": {
"analyzer": {
"my_ngram_analyzer": {
"tokenizer": "my_ngram_tokenizer"
}
},
"tokenizer": {
"my_ngram_tokenizer": {
"type": "edge_ngram", <---- change this
"min_gram": "3",
"max_gram": "3",
"token_chars": [
"letter",
"digit"
]
}
}
}
}
我正在使用 Elastic 5.4 来实现建议/完成之类的功能,并且在根据我的要求选择正确的分词器时面临问题。下面是示例:
索引中有4篇文献,内容如下:
文档 1:掌声
文档 2:苹果
文档 3:这是一个苹果
文档 4:应用程序
文档 5:有 is_an_appl
查询
查询 1:查询字符串“App”应该 return 所有 5 个文档。
查询 2:查询字符串“Apple”应该 return 仅文档 2 和文档 3。
查询 3:查询字符串“Applications”应该 return 仅记录 4.
查询 4:查询字符串“appl”应该 return 所有 5 个文档。
分词器
我在 Elastic 中使用以下分词器,我看到所有文档 return 为查询 2 和查询 3 编辑。
分析器应用于“text”类型的字段。
"settings": {
"analysis": {
"analyzer": {
"my_ngram_analyzer": {
"tokenizer": "my_ngram_tokenizer"
}
},
"tokenizer": {
"my_ngram_tokenizer": {
"type": "ngram",
"min_gram": "3",
"max_gram": "3",
"token_chars": [
"letter",
"digit"
]
}
}
}
}
如何将结果限制为 return 个文档,这些文档包含与查询字符串完全匹配的内容,无论是作为现有单词、短语还是精确单词的一部分(我已经提到了上述查询中提供了预期结果)?
那是因为您使用的是 nGram
tokenizer instead of edgeNGram
。后者仅索引前缀,而前者将索引前缀、后缀以及数据的子部分。
将您的分析器定义更改为此,它应该会按预期工作:
"settings": {
"analysis": {
"analyzer": {
"my_ngram_analyzer": {
"tokenizer": "my_ngram_tokenizer"
}
},
"tokenizer": {
"my_ngram_tokenizer": {
"type": "edge_ngram", <---- change this
"min_gram": "3",
"max_gram": "3",
"token_chars": [
"letter",
"digit"
]
}
}
}
}