我们正在尝试设置和使用percolate,但是我们并没有得到预期的结果。
首先,我注册了一些查询:
curl -XPUT 'localhost:9200/index-234234/.percolator/query1' -d '{
"query" : {
"range" : {
"price" : { "gte": 100 }
}
}
}'
curl -XPUT 'localhost:9200/index-234234/.percolator/query2' -d '{
"query" : {
"range" : {
"price" : { "gte": 200 }
}
}
}'
然后,当我尝试将它与150匹配时,理想情况下应该只匹配query1
,而不是匹配两个查询:
curl -XGET 'localhost:9200/index-234234/message/_percolate' -d '{
"doc" : {
"price" : 150
}
}'
{"took":4,"_shards":{"total":5,"successful":5,"failed":0},"total":2,"matches":[{"_index":"index-234234","_id":"query1"},{"_index":"index-234234","_id":"query2"}]}
如果你能告诉我为什么会这样,我将不胜感激。
问题是您在为文档设置映射之前注册了您的percolator查询。渗透器必须在没有定义映射的情况下注册查询,这可能是一个问题,特别是对于范围查询。
您应该重新开始删除索引,然后先运行这个映射命令:
curl -XPOST localhost:9200/index-234234 -d '{
"mappings" : {
"message" : {
"properties" : {
"price" : {
"type" : "long"
}
}
}
}
}'
然后执行前面的命令(注册两个percolator查询,然后渗透一个文档),您将得到以下正确的响应:
{"took":3,"_shards":{"total":5,"successful":5,"failed":0},"total":1,"matches":[{"_index":"index-234234","_id":"query1"}]}
你可能会发现几年前的讨论很有帮助:
http://grokbase.com/t/gg/elasticsearch/124x6hq4ev/range-query-in-percolate-not-working不是一个解决方案,但这对我来说是有效的(不知道为什么):
- 注册两个percolator查询
- 执行
_percolator
请求(返回结果:"total": 2
) - 再次注册两个percolator查询(现在都在版本2中)
- 再次执行
_percolator
请求(返回正确的结果:"total": 1
)