我目前正在尝试将基于Solr的应用程序迁移到Elasticsearch。
我有这个lucene查询
(( name:(+foo +bar) OR info:(+foo +bar) )) AND state:(1) AND (has_image:(0) OR has_image:(1)^100)
据我了解,这是MUST子句与布尔OR的组合:
“获取所有包含(名称中包含foo AND条)或(信息中包含foo AND条)的所有文档。在此之后,按条件state = 1过滤结果,并增强具有图像的文档。”
我一直在尝试将布尔查询与MUST一起使用,但是我无法将布尔OR放入must子句中。这是我所拥有的:
GET /test/object/_search { "from": 0, "size": 20, "sort": { "_score": "desc" }, "query": { "bool": { "must": [ { "match": { "name": "foo" } }, { "match": { "name": "bar" } } ], "must_not": [], "should": [ { "match": { "has_image": { "query": 1, "boost": 100 } } } ] } } }
如您所见,“信息”的必填条件缺失。
有没有人有办法解决吗?
非常感谢。
更新
我已经更新了我的Elasticsearch查询并摆脱了该功能得分。我的基本问题仍然存在。
我终于设法创建了一个查询,该查询完全可以实现我想要的功能:
过滤的嵌套布尔查询。我不确定为什么没有对此进行记录。也许有人可以告诉我?
这是查询:
GET /test/object/_search { "from": 0, "size": 20, "sort": { "_score": "desc" }, "query": { "filtered": { "filter": { "bool": { "must": [ { "term": { "state": 1 } } ] } }, "query": { "bool": { "should": [ { "bool": { "must": [ { "match": { "name": "foo" } }, { "match": { "name": "bar" } } ], "should": [ { "match": { "has_image": { "query": 1, "boost": 100 } } } ] } }, { "bool": { "must": [ { "match": { "info": "foo" } }, { "match": { "info": "bar" } } ], "should": [ { "match": { "has_image": { "query": 1, "boost": 100 } } } ] } } ], "minimum_should_match": 1 } } } } }
在伪SQL中:
SELECT * FROM /test/object WHERE ((name=foo AND name=bar) OR (info=foo AND info=bar)) AND state=1
请记住,它是如何在内部处理name = foo的,这取决于您的文档字段分析和映射。这可以从模糊行为到严格行为不等。
“ minimum_should_match”:1表示,应该至少一个should语句为真。
此语句意味着只要结果集中有一个包含has_image:1的文档,它就会增加100倍。这将更改结果的顺序。
"should": [ { "match": { "has_image": { "query": 1, "boost": 100 } } } ]
玩得开心:)