web-dev-qa-db-ja.com

弾性検索-search_analyzer vs index_analyzer

私は http://euphonious-intuition.com/2012/08/more-complicated-mapping-in-elasticsearch/ を見ていました。これはElasticSearchアナライザーについて説明しています。

異なる検索アナライザーとインデックスアナライザーを持つことについての部分は理解できませんでした。カスタムマッピングの2番目の例は次のようになります。
->インデックスアナライザーはedgeNgramです
->検索アナライザー:

"full_name":{
    "filter":[
        "standard",
        "lowercase",
        "asciifolding"
    ],
    "type":"custom",
    "tokenizer":"standard"
}

クエリ「Race」が*ra* pportおよび*rac* ialのような結果を返さないようにするには、edgeNgramを使用します。そもそもなぜedgeNgramでインデックス付けするのですか?

さまざまなアナライザーが役立つ例で説明してください。

37
Pavan K Mutt

通常、インデックス時間とクエリ時間の両方で同様の分析チェーンがあります。類似は完全に同じという意味ではありませんが、通常、ドキュメントのインデックス作成方法はドキュメントのクエリ方法を反映しています。

Ngramsの例は、インデックスとクエリ時に異なるアナライザーを使用する主な理由の1つであるため、非常に適しています。

部分一致の場合、Edge ngramsでインデックスを作成するため、「elasticsearch」は(mingram 3およびmaxgram 20で)になります。

「ela」、「elas」、「elast」、「elasti」、「elastic」、「elastics」、「elasticse」、「elasticsea」、「elasticsear」、「eleasticsearc」および「elasticsearch」

作成されたフィールドを照会してみましょう。 「エラスティック」という用語を照会すると、一致があり、予想される結果が返されます。基本的に、インデックスを作成したものを前提に、上記の部分一致と呼ばれるものを完全一致に変更しました。クエリにngramを適用する必要もありません。行った場合、次のすべての用語を照会します。

「ela」、「elas」、「elast」、「elasti」および「elastic」

これにより、クエリの方法がより複雑になり、奇妙な結果も得られます。同じフィールドの別のドキュメントで「経過」という用語にインデックスを付けたとします。次のngramがあります。

「ela」、「elap」、「elaps」、「elapse」、「elapsed」

「エラスティック」を検索してクエリにngramを作成すると、「エラ」という用語もこの2番目のドキュメントに一致します。したがって、「エラスティック」という用語全体を含む用語がなくても、最初のドキュメントと一緒に戻ります。探していました。

analyze api を見て、さまざまなアナライザーとさまざまな結果を試してみることをお勧めします。

80
javanna

参照するには インデックスと検索アナライザーに関する公式ドキュメント

インデックスと検索時に別のアナライザーを使用することが理にかなっています。たとえば、インデックス作成時に同義語のインデックスを作成したい場合があります。たとえば、quickが発生するたびに、高速、迅速、迅速にインデックスを作成します。ただし、検索時には、これらの同義語をすべて検索する必要はありません。代わりに、ユーザーが入力した1つのWordを検索するだけで、迅速、迅速、迅速、迅速に対応できます。

この区別を有効にするために、Elasticsearchはindex_analyzerおよびsearch_analyzerパラメーター、およびdefault_indexおよびdefault_searchという名前のアナライザーもサポートします。

これらの追加パラメーターを考慮すると、インデックス作成時の完全なシーケンスは実際には次のようになります。

  • フィールドマッピングで定義されたindex_analyzer
  • フィールドマッピングで定義されたアナライザー、それ以外の場合
  • ドキュメントの_analyzerフィールドで定義されたアナライザー、そうでない場合
  • タイプのデフォルトのindex_analyzer。デフォルトは
  • タイプのデフォルトのアナライザー。デフォルトは
  • インデックス設定でdefault_indexという名前のアナライザー。デフォルトは
  • インデックス設定でdefaultという名前のアナライザー。デフォルトは
  • ノードレベルでdefault_indexという名前のアナライザー。デフォルトは
  • ノードレベルでdefaultという名前のアナライザー。デフォルトは
  • 標準アナライザー

検索時:

  • クエリ自体で定義されたアナライザー、それ以外の場合
  • フィールドマッピングで定義されたsearch_analyzer
  • フィールドマッピングで定義されたアナライザー、それ以外の場合
  • タイプのデフォルトのsearch_analyzer。デフォルトは
  • タイプのデフォルトのアナライザー。デフォルトは
  • インデックス設定でdefault_searchという名前のアナライザー。デフォルトは
  • インデックス設定でdefaultという名前のアナライザー。デフォルトは
  • ノードレベルでdefault_searchという名前のアナライザー。デフォルトは
  • ノードレベルでdefaultという名前のアナライザー。デフォルトは
  • 標準アナライザー
8
Asimov4