テキスト検索キーワード



多くの人々は、単に弾性を学習し始めているText and Keyword フィールドデータ型.それらの違いは単純ですが、非常に重要です.この記事では、違いをどのように使用するには、どのように振る舞う、とのいずれかを使用して話をします.

違い


それらの間の重要な違いはText それが分析されない間、それが逆のインデックスに格納される前にKeyword 種類分析されるか、分析されないかは、質問されるとき、それがどのように振る舞うかに影響します.
あなただけのFlasticSearchを学び始めているとまだ何が反転インデックスとアナライザは、私は読書をお勧めしますbasic guide to Elasticsearch ファースト.

使い方


あなたが前にフィールドへのマッピングを定義することなくストリングを含む弾性検索への文書をインデックスするならば、Text and Keyword データ型.しかし、動的マッピングで動作しても、ユースケースに応じて任意のドキュメントをインデックス化する前に、マッピングの設定を定義することをお勧めします.
これらはマッピング設定の例ですText and Keyword タイプは、この例の前に作成した“text - vsキーワード”というインデックスを使用します.
キーワードマッピング
curl --request PUT \
  --url http://localhost:9200/text-vs-keyword/_mapping \
  --header 'content-type: application/json' \
  --data '{
 "properties": {
  "keyword_field": {
   "type": "keyword"
  }
 }
}'
テキストマッピング
curl --request PUT \
  --url http://localhost:9200/text-vs-keyword/_mapping \
  --header 'content-type: application/json' \
  --data '{
 "properties": {
  "text_field": {
   "type": "text"
  }
 }
}'
マルチフィールズ
curl --request PUT \
  --url http://localhost:9200/text-vs-keyword/_mapping \
  --header 'content-type: application/json' \
  --data '{
 "properties": {
  "text_and_keyword_mapping": {
   "type": "text",
   "fields": {
    "keyword_type": {
     "type":"keyword"
    }
   }
  }
 }
}'

彼らの仕事


両方のフィールド型は、逆のインデックスで異なるインデックスされます.インデックス処理の違いは、エラスティックサーチにクエリを実行したときに影響します.
例えば、ドキュメントをインデックスしましょう.
curl --request POST \
  --url http://localhost:9200/text-vs-keyword/_doc/example \
  --header 'content-type: application/json' \
  --data '{
 "keyword_field":"The quick brown fox jumps over the lazy dog",
 "text_field":"The quick brown fox jumps over the lazy dog"
}'
実行後curl 上記のコマンドを実行してから、インデックス内のすべてのドキュメントを取得した場合は、次のコマンドを実行します.
{
    "_index": "text-vs-keyword",
    "_type": "_doc",
    "_id": "example",
    "_score": 1.0,
    "_source": {
        "keyword_field": "The quick brown fox jumps over the lazy dog",
        "text_field": "The quick brown fox jumps over the lazy dog"
    }
}

キーワード


もっと簡単に始めましょう.Keyword . 弾性を分析しないKeyword データ型とは、インデックスの文字列をそのまま保持します.
したがって、上の例では、文字列は逆のインデックスのようになりますか?

はい、あなたは正しい、それは正確にあなたが書くように.

テキスト


と違ってKeyword フィールドデータ型、InherticSearchにインデックス化された文字列は、逆のインデックスに格納される前に、アナライザのプロセスを通過します.デフォルトでは、AnalySearchの標準アナライザは分割し、インデックスを付けられた文字列を下げます.あなたは標準アナライザについての詳細を学ぶことができますElasticsearch’s documentation .
AnimicSearchは、テキストが解析プロセスの後にどのように見えるか確認するAPIを持っています.
curl --request POST \
  --url http://localhost:9200/text-vs-keyword/_analyze?pretty \
  --header 'content-type: application/json' \
  --data '{
  "analyzer": "standard",
  "text": "The quick brown fox jumps over the lazy dog"
}'
したがって、上記の応答に従って、これは逆のインデックスがどのように見えるかですtext_field フィールド

とは少し違うkeyword 一つ正しいかしかし、それは逆のインデックスに格納されるものに注意を払う必要があります.なぜなら、それは問い合わせプロセスに大きな影響を与えるからです.

テキストとキーワードのクエリ


今私たちはtext and keyword インデックスのときに振る舞う、どのように彼らは照会している動作する方法を学びましょう.
まず、文字列に対して2種類のクエリがあることを知っていなければなりません.
  • マッチクエリ
  • 用語クエリ
  • と同じText and Keyword , 間の違いMatch Query and Term QueryMatch Query のクエリを実行しますTerm Query でない.
    問合せは、逆のインデックスの用語と照会された用語を照合することによって、検索します、そして、逆のインデックスの1つは正確に同じでなければなりません.これは、索引付けと問い合わせ結果の解析された文字列と非解析文字列が非常に異なる結果を生むことを意味します.

    タームクエリによるキーワードフィールドの問い合わせ


    フィールドデータ型とクエリの両方が解析されていないので、結果を生成できるように両方とも正確に同じにする必要があります.
    まったく同じクエリを試してみてください.
    curl --request POST \
      --url 'http://localhost:9200/text-vs-keyword/_doc/_search?size=0' \
      --header 'content-type: application/json' \
      --data '{
     "query": {
      "term": {
       "keyword_field": "The quick brown fox jumps over the lazy dog"
      }
     }
    }'
    
    結果を返す
    {
            "_index": "text-vs-keyword",
            "_type": "_doc",
            "_id": "example",
            "_score": 0.2876821,
            "_source": {
              "keyword_field": "The quick brown fox jumps over the lazy dog",
              "text_field": "The quick brown fox jumps over the lazy dog"
            }
          }
    }
    
    逆のインデックスに単語があっても、正確でない何かを試してみてください.
    curl --request POST \
      --url 'http://localhost:9200/text-vs-keyword/_doc/_search?size=0' \
      --header 'content-type: application/json' \
      --data '{
     "query": {
      "term": {
       "keyword_field": "The"
      }
     }
    }'
    
    クエリの用語が反転インデックス内の任意の条件に一致しないため、結果は返されませんでした.

    マッチクエリによるキーワードフィールドのクエリ


    まず最初に“クイックブラウンフォックスは、怠惰な犬の上にジャンプ”と同じ文字列を問い合わせてみましょうMatch Query to keyword_mapping また、
    curl --request POST \
      --url http://localhost:9200/text-vs-keyword/_doc/_search \
      --header 'content-type: application/json' \
      --data '{
     "query": {
      "match": {
       "keyword_field": "The quick brown fox jumps over the lazy dog"
      }
     }
    }'
    
    結果は次のようになります.
    {
     "_index": "text-vs-keyword",
     "_type": "_doc",
     "_id": "example",
     "_score": 0.2876821,
     "_source": {
      "keyword_field": "The quick brown fox jumps over the lazy dog",
      "text_field": "The quick brown fox jumps over the lazy dog"
     }
    }
    
    待って、分析されたクエリを生成された用語は“逆の茶色の狐は、怠惰な犬の上に反転したインデックス”で正確な一致ではないので、結果を生成する必要はありませんが、なぜそれが結果を生成するのですか?
    それは正しいです、我々が使用しているので、質問は分析されましたMatch Query , しかし、標準的なアナライザの代わりにindex-time アナライザは、Keyword フィールドデータ型.を使用して解析されるのでKeyword フィールドデータ型はterm analyzerです.エラスティックサーチはクエリ内で何も変更しません.
    では、標準アナライザを試してみましょう.
    curl --request POST \
      --url http://localhost:9200/text-vs-keyword/_doc/_search \
      --header 'content-type: application/json' \
      --data '{
     "query": {
      "match": {
       "keyword_field": {
        "query": "The quick brown fox jumps over the lazy dog",
        "analyzer":"standard"
       }
      }
     }
    }'
    
    結果を生成することはできません.これは、クエリを解析します.

    タームクエリによるテキスト型の問い合わせ


    テキストタイプの索引付けされたドキュメントは前のセクションで見ることができる多くの用語を持ちます.クエリを反転インデックスの条件と一致させる方法を示すには、2つのクエリを試してみましょう.最初のクエリでは、全体の文をエラスティックサーチに送信します
    curl --request POST \
      --url 'http://localhost:9200/text-vs-keyword/_doc/_search?pretty=' \
      --header 'content-type: application/json' \
      --data '{
     "query": {
      "term": {
       "text_field": "The quick brown fox jumps over the lazy dog"
      }
     }
    }'
    
    番目の1つだけ“”
    curl --request POST \
      --url 'http://localhost:9200/text-vs-keyword/_doc/_search?pretty=' \
      --header 'content-type: application/json' \
      --data '{
     "query": {
      "term": {
       "text_field": "The"
      }
     }
    }'
    
    両方のクエリは結果を生成しません.
    逆のインデックスでは、私たちは決して文全体を保存しなかったので、最初の質問は結果を生じませんでした、インデックス処理はテキストからすでにチャンクされた用語だけを保存します.
    2番目のクエリは結果も生成しませんでした.索引付けされた文書の中に“the”がありますが、アナライザが単語をキャッシュしたことを覚えているので、反転インデックスでは
    また、"this "という用語をもう一度問い合わせてみましょう.
    curl --request POST \
      --url 'http://localhost:9200/text-vs-keyword/_doc/_search?pretty=' \
      --header 'content-type: application/json' \
      --data '{
     "query": {
      "term": {
       "text_field": "the"
      }
     }
    }'
    
    ええ!質問された「the」が逆のインデックスの「the」との正確なマッチであるので、それは結果を生じました.

    マッチクエリを使用したテキスト型のクエリ


    今ではテキストタイプの時間ですMatch Query , それは両方の種類を分析するので、結果を生成するためにそれらを得るのは簡単です.つの質問を最初に試してみましょう
    最初のクエリは、“弾性”を検索するにはterm query それは結果を生じませんmatch query ?
    番目のクエリは、“ラズ犬は、Thの速い茶色の犬の上にトリップ”、いくつかの単語は、逆のインデックスにある、いくつかはされていない、それから任意の結果を生成するエラスティック検索を送信しますか?
    curl --request POST \
      --url 'http://localhost:9200/text-vs-keyword/_doc/_search?pretty=' \
      --header 'content-type: application/json' \
      --data '{
     "query": {
      "match": {
       "text_field": "The"
      }
     }
    }'
    
    curl --request POST \
      --url 'http://localhost:9200/text-vs-keyword/_doc/_search?pretty=' \
      --header 'content-type: application/json' \
      --data '{
     "query": {
      "match": {
       "text_field": "the LAZ dog tripped over th QUICK brown dog"
      }
     }
    }'
    
    ええ!二人は結果を出した
    {
        "_index": "text-vs-keyword",
        "_type": "_doc",
        "_id": "example",
        "_score": 0.39556286,
        "_source": {
            "keyword_field": "The quick brown fox jumps over the lazy dog",
            "text_field": "The quick brown fox jumps over the lazy dog"
        }
    }
    
    最初のクエリーは、クエリ内の“”が解析され、反転インデックス内の1との厳密な一致を示す“the”になったので結果を生成しました.
    2番目のクエリは、すべての用語が反転インデックス内にあるとは限りませんが、結果を生成します.RelicSearchは結果の値を返します.
    あなたが結果に注意を払うならば、ある_score フィールド.逆のインデックスの1つとの正確なマッチである質問の用語の多くは、スコアに影響を与えるものの一つですが、別の日のスコアを計算して保存しましょう.

    使うとき


    用途keyword フィールドデータ型ならば
  • あなたが正確に一致するクエリを
  • 他のデータベースのようなエラスティックサーチ機能を作りたい
  • ワイルドカードクエリ用に使用します
  • テキストフィールドのデータ型を使用します.
  • 自動補完を作成します
  • 検索システムを作成します
  • 結論


    理解text and keyword フィールドデータ型の仕事は、あなたがFlasticSearchで学ぶことを望むものの一つですが、違いは簡単ですが、多くの問題があります.
    フィールドデータ型の両方を使用する場合は、マッピングを作成するときにマルチフィールド機能を使用できます.
    最後に、この記事では、AntiticSearchの学習とFelticSearchのテキストとキーワードフィールドのデータ型の違いを理解するのに役立ちます.読書ありがとう!