我无法让edgengram查询正常运行。我有一个记录“蓝草”,其中edgengram最小为2.查询字符串“blv”然而返回“蓝草”,但它不应该。
curl -X POST http://localhost:9200/test -d '{
"mappings": {
"product/fragrance": {
"properties": {
"name_query": {
"index_analyzer": "query_index_analyzer",
"search_anaylzer": "query_search_analyzer",
"as": {},
"type": "string"
}
}
}
},
"settings": {
"analysis": {
"filter": {
"query_edgengram": {
"type": "edgeNGram",
"min_gram": 2,
"max_gram": 20,
"side": "front"
}
},
"analyzer": {
"query_index_analyzer": {
"tokenizer": "lowercase",
"filter": ["asciifolding", "query_edgengram"]
},
"query_search_analyzer": {
"tokenizer": "lowercase",
"filter": ["asciifolding"]
}
}
}
}
}'
curl -X POST "http://localhost:9200/test/product%2Ffragrance/1" -d '{
"name_query": "blue grass"
}'
curl -X GET "http://localhost:9200/test/product%2Ffragrance/_search?load=true&pretty=true" -d '{
"query": {
"bool": {
"must": [{
"query_string": {
"query": "blv",
"fields": ["name_query"],
"default_operator": "OR"
}
}]
}
}
}'
出于某种原因,我得到了一个结果。有谁能解释为什么?谢谢。我想要发生的是“blv”不应该返回“蓝草”,尽管“bl”应该。我已经使用了分析API,看到“蓝草”被分解为“bl”,“blu”,“blue”,“gr”,“gra”,“gras”,“grass”但是“blv”没有t匹配其中任何一个。
答案 0 :(得分:2)
正如大卫在他的回答中告诉你的那样,分析了一些弹性搜索查询。通常您不希望将ngrams应用于您的查询,但您似乎已经知道给定您的映射。事实上,没有考虑没有ngrams的搜索分析器的原因是错误:search_anaylzer
而不是search_analyzer
。这就是您的查询变为bl
和blv
,bl
与返回的文档匹配的原因。
答案 1 :(得分:1)
使用MatchQuery或QueryString搜索某些内容时,会应用相同的分析器。 所以blv被标记为bl,blv和bl匹配bl!
您可以使用未分析的TermQuery。
很难说更多,因为我没有你的疑问。
大卫