繁体   English   中英

ElasticSearch lucene 子句转换为 ES 语法的查询

[英]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
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}

注意:对于内部布尔值,使用shouldmust会产生相同的结果,老实说,我不确定使用哪个更好,所以我只是随意使用must

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM