🤖

🤖

:gijutsu_burogu:

ElasticsearchのNamed queries

やりたいこと

「ナイキ スニーカー」という検索キーワードがあった場合に、ナイキ→ブランド、スニーカー→商品カテゴリとElasticsearchで分類したい。(前提としてブランド名一覧のワード集合と商品カテゴリ一覧のワード集合はあるとする) Elasticsearchで分類するメリットはアナライザにより表記揺れを吸収できる点で、「NIKE」でも「ナイキ」でもブランドとしての「ナイキ」と分類できる。 単純に考えると以下のようなElasticsearchに以下のようなクエリを投げるイメージ。

GET _search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "field.analyzed": {
              "query": "ナイキ"
            }
          }
        },
        {
          "match": {
            "field.analyzed": {
              "query": "すにーかー"
            }
          }
        }
      ]
    }
  }
}

課題

Elasticsearchから返却されるのはキーワードがアナライザを通ってマッチするドキュメントが返却される場合がある。 その場合に、キーワードと分類分けの対応づけが分からなくなる。 例えば、ワード「ナイキ」で検索してドキュメント「Nike」が返却されても、「ナイキ」がブランド「Nike」と分類されたと呼び出し側は判断することができない。 これは、「ナイキ」だけで検索した場合であれば分類可能であるが、should句で複数ワードで検索した場合は分からない。 ワード数の回数クエリを投げれば分類可能であるがこれはパフォーマンスや負荷の観点で非効率的である。

inputとoutput

解決法

この課題はNamed queriesで解決できる。

Named queriesとは

www.elastic.co

以下のようにshould句でOR検索をする際に、どのドキュメントがどのワードでマッチしたかもElasticsearchのレスポンスで返却される。

GET _search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "field.analyzed": {
              "query": "ナイキ",
              "_name": "ナイキ"
            }
          }
        },
        {
          "match": {
            "field.analyzed": {
              "query": "すにーかー",
              "_name": "すにーかー"
            }
          }
        }
      ]
    }
  }
}

Named queriesの他のユースケース

こちらの記事で他のNamed queriesの具体的ユースケースについて触れられていました。

opster.com

Use case 1 – query debugging

Use case 2 – specific query logic

Use case 3 – diversifying search results

Use case 4 – logging

検索改善へのヒントが得られるかも知れません、詳しくはリンク先へ!