我一直在尝试将一个lucene风格的查询转换为ES查询语法,但是我在子子句上卡住了。(title:history^10 or series:history) and (NOT(language:eng) OR language:eng^5) and (isfree eq 'true' OR (isfree eq 'false' AND owned eq 'abc^5'))
这表明“让我在'标题'或'系列'的历史匹配,但提高标题匹配和语言不一定是英语,但如果如果是然后提高它和匹配是免费的或不是免费的地方,然后确保它是由客户abc拥有”.
我觉得这是一个棘手的查询,但它似乎是正确的工作。转换子句到ES语法是困惑我,因为我真的没有括号的概念。我认为我需要使用布尔查询...我有以下我知道没有正确应用的标准-它说你应该有(语言:eng OR isFree eq 'true' OR owned:abc)。我似乎不能使精神飞跃,以建立必须/应该与非在它。
帮帮忙好吗?
"query": {
"bool": {
"must": [
{
"multi_match": {
"query": "history",
"fields": [
"title^10.0",
"series"
]
}
}
],
"should": [
{
"term": {
"language": {
"value": "eng",
"boost": 5
}
}
},
{
"term": {
"isFree": {
"value": true
}
}
},
{
"term": {
"owned": {
"value": "abc",
"boost": 5
}
}
}
]
}
},
1条答案
按热度按时间sd2nnvve1#
您的查询几乎是正确的,唯一没有正确翻译的是查询的以下部分:
如果我没理解错的话,这基本上就是说 * 当'owned'字段的值为'abc'而价格为free时,将其提升5倍 *。要实现这一点,您需要使用一个额外的bool查询:
isFree: true
筛选结果abc
匹配的任何文档的所属字段由于这并不是为了限制结果集,而是为了只提升满足此条件的结果,因此上面的bool查询应该放在父bool的
should
部分中。注意:使用
should
和must
对内部bool产生相同的结果,老实说,我不确定使用哪一个更好,所以我只是随意使用must
。