我正在使用Ngram tokenizer,我已将min_length指定为3,将max_length指定为5.但即使我尝试搜索长度大于5的单词,它仍然会给我结果。这很奇怪,因为ES不会索引结合长度为6,但我仍然能够找回记录。我在这里找不到任何理论吗?如果没有,NGram的max_length真正具有什么意义呢?以下是我试过的映射..
PUT ngramtest
{
"mappings": {
"MyEntity":{
"properties": {
"testField":{
"type": "text",
"analyzer": "my_analyzer"
}
}
}
},
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "ngram",
"min_gram": 3,
"max_gram": 5
}
}
}
}
}
将测试实体编入索引:
PUT ngramtest/MyEntity/123
{
"testField":"Z/16/000681"
}
AND,这个查询奇怪地显示
的结果GET ngramtest/MyEntity/_search
{
"query": {
"match": {
"testField": "000681"
}
}
}
我试过这个以便分析'字符串:
POST ngramtest/_analyze
{
"analyzer": "my_analyzer",
"text": "Z/16/000681."
}
如果我出错了,有人可以纠正我吗?
答案 0 :(得分:1)
原因是您的分析器my_analyzer
用于索引 AND 搜索。因此,当您搜索6个字符abcdef
的单词时,您的ngram分析器也会在搜索时分析该单词并生成标记abc
,abcd
,{{1} },abcde
等,这些将匹配索引标记。
您需要做的是指定您希望在映射中使用标准分析器bcd
search_analyzer
在擦除索引并重新填充之前,您可以通过指定要在匹配查询中使用的搜索分析器来测试此理论:
"testField":{
"type": "text",
"analyzer": "my_analyzer",
"search_analyzer": "standard"
}