![](/img/trans.png)
[英]Elasticsearch Lucene query syntax to add and subtract N minutes with time field?
[英]ElasticSearch lucene query with subclauses conversion to ES syntax
我一直在尝试将 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 语法让我感到困惑,因为我真的没有括号的概念。 我想我需要使用 bool 查询...我知道以下内容没有正确应用标准 - 它说你应该有(语言: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
}
}
}
]
}
},
您的查询几乎是正确的,唯一没有正确翻译的是查询的这一部分:
(isfree eq 'true' OR (isfree eq 'false' AND owned eq 'abc^5'))
如果我对你的帖子的理解正确,这基本上是说当它的值为 'abc' 并且价格是免费时,将 'owned' 字段提高五倍。 要实现这一点,您需要使用一个额外的 bool 查询:
isFree: true
abc
的文档的拥有字段"bool": {
"filter": [
{
"term": {
"isFree": {
"value": false
}
}
}
],
"must": [
{
"term": {
"owned": {
"value": "abc",
"boost": 5
}
}
}
]
}
由于这不是为了限制结果集,而是仅提升满足此条件的结果,因此上面的 bool 查询应放在父 bool 的should
部分中。 最终查询如下所示:
POST /myindex/_search
{
"explain": true,
"query": {
"bool": {
"must": [
{
"multi_match": {
"query": "history",
"fields": [
"title^10",
"series"
]
}
}
],
"should": [
{
"term": {
"language": {
"value": "eng",
"boost": 5
}
}
},
{
"bool": {
"filter": [
{
"term": {
"isFree": {
"value": false
}
}
}
],
"must": [
{
"term": {
"owned": {
"value": "abc",
"boost": 5
}
}
}
]
}
}
]
}
}
}
注意:对于内部布尔值,使用should
和must
会产生相同的结果,老实说,我不确定使用哪个更好,所以我只是随意使用must
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.