1

最近Solrから切り替えたばかりなので、私はelasticsearchの初心者です。現在、solrconfig から edismax クエリを変換して、elasticsearch で動作するようにしようとしています。

基本的に、一度に 2 つのフィールドで用語を検索したいので、次のクエリで終了しました。

{
  "query": {
    "dis_max": {
      "queries": [
        {
          "match": {
            "field_1": {
              "query": "term1"
            }
          }
        },
        {
          "match": {
            "field_2": {
              "query": "term1"
            }
          }
        }
      ]
    }
  }
}

これは、単一の用語でうまく機能します。複数の用語の場合、各用語が見つかる必要はありません。ただし、この機能を実装する方法が見つかりませんでした。これが、 bool queryによって提供されるminimum_should_matchパラメータの目的です。

3 つの用語があり、そのうちの少なくとも 2 つを見つけたいとします。試行錯誤を経て、次のようなものを含む多くのバリアントをチェックしました。

{
  "query": {
    "dis_max": {
      "queries": [
        {
          "match": {
            "field_1": {
              "query": "term1 term2 nonexistingterm",
              "operator": "and",
              "minimum_should_match": 2
            }
          }
        },
        {
          "match": {
            "field_2": {
              "query": "term1 term2 nonexistingterm",
              "operator": "and",
              "minimum_should_match": 2
            }
          }
        }
      ]
    }
  }
}

しかしminimum_should_match、ここでは機能せず、and演算子が原因で結果が見つかりません。or結果を返すには1回のヒットで十分であるため、どちらでも機能しません。

誰かが私と組み合わせるdis_maxのを手伝ってくれますかminimum should match?

これに関するドキュメントが見つからなかったので、elasticsearch でこれらの情報を自分で見つけることができるヒントをいただければ幸いです。

4

1 に答える 1

2

も使用operator: andおよび提供しminimum_should_matchていますが、これは完全には意味がありません。そこで、operator: and次のようなクエリが生成されます。

field1:term1 AND field1:term2 AND field1:nonexistingterm

そのため、設定に関係なく、それらすべてが必要ですminimum_should_match。最小の should 一致動作を効果的に使用するには、"or" 演算子を使用して should 句を生成する必要があります。「or」がデフォルトであるため、これは設定を削除するのと同じくらい簡単で、operator探している動作が表示されるはずです。あれは:

{
  "query": {
    "dis_max": {
      "queries": [
        {
          "match": {
            "field_1": {
              "query": "term1 term2 nonexistingterm",
              "minimum_should_match": 2
            }
          }
        },
        {
          "match": {
            "field_2": {
              "query": "term1 term2 nonexistingterm",
              "minimum_should_match": 2
            }
          }
        }
      ]
    }
  }
}
于 2014-02-28T16:04:47.913 に答える