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

aiqt4smr  于 2022-11-07  发布在  Lucene
关注(0)|答案(1)|浏览(204)

我一直在尝试将一个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
            }
          }
        }
      ]
    }
  },
sd2nnvve

sd2nnvve1#

您的查询几乎是正确的,唯一没有正确翻译的是查询的以下部分:

(isfree eq 'true' OR (isfree eq 'false' AND owned eq 'abc^5'))

如果我没理解错的话,这基本上就是说 * 当'owned'字段的值为'abc'而价格为free时,将其提升5倍 *。要实现这一点,您需要使用一个额外的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对内部bool产生相同的结果,老实说,我不确定使用哪一个更好,所以我只是随意使用must

相关问题