1. ホーム
  2. エラスチックサーチ

[解決済み】elasticsearchのboolクエリはORで結合する必要があります。

2022-04-20 19:32:42

質問

現在、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 bar)または(情報にfoo AND bar)を含むすべてのドキュメントを取得します。その後、state=1という条件で絞り込み、画像を持つドキュメントをブーストする(")。

MUSTでboolクエリを使おうとしていますが、must句にboolan ORを入れるのに失敗しています。以下は、私が持っているものです。

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

見ての通り、"info" の MUST 条件が抜けています。

どなたか解決策をお持ちの方はいらっしゃいますか?

本当にありがとうございました。

** UPDATE **

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文の少なくとも1つが真でなければならないことを示します。

このステートメントは、結果セットの中に has_image:1 を含むドキュメントがある場合、それが100倍になることを意味します。これは結果の順序を変更します。

"should": [
  {
    "match": {
      "has_image": {
        "query": 1,
        "boost": 100
      }
    }
   }
 ]

みんな楽しんでね :)