web-dev-qa-db-ja.com

Elastic Searchの複数の「一致フレーズ」クエリ

これは私には明白ですが、そうではありません。次の2つは2番目のフェーズ(この場合、Cape Basin

"query": {
  "match_phrase": {
    "contents": {
      "query": "St Peter Fm",
      "query": "Cape Basin"
    }
  }
}

"query": {
  "match_phrase": {
    "contents": {
      "query": ["St Peter Fm", "Cape Basin"]
    }
  }
}

エラーで次の鳴き声

"query": {
  "match_phrase": {
    "contents": {
      "query": "St Peter Fm"
    },
    "contents": {
      "query": "Cape Basin"
    }
  }
}

入力したとおりにどちらかフレーズを含むすべてのドキュメントを照合します。

18
punkish

同じフィールド名を2回使用するため、最初のクエリは実際には有効なJSONオブジェクトではありません。

bool must query を使用して、両方のフレーズを照合できます。

PUT phrase/doc/1
{
  "text": "St Peter Fm some other text Cape Basin"
}
GET phrase/_search
{
  "query": {
    "bool": {
      "must": [
         {"match_phrase": {"text":  "St Peter Fm"}},
         {"match_phrase": {"text":  "Cape Basin"}}
      ]
    }
 }
}
24
Jakub Kotowski

multi_matchの句のセマンティクスを有効にすることでこれを実行できることがわかりました。

これを行うには、以下のようにtype:属性をmulti_match構文に追加します。

GET /_search
{
  "query": {
    "multi_match" : {
      "query":      "quick brown fox",
      "type":       "phrase",
      "fields":     [ "subject", "message" ]
    }
  }
}

そのように考えると(他の検索句で「マルチ」サポートを有効にするのではなく)、期待したとおりに収まります。

ref: https://www.elastic.co/guide/en/elasticsearch/reference/6.5/query-dsl-multi-match-query.html#type-phrase

7
Jim K.