web-dev-qa-db-ja.com

ElasticSearch検索クエリは大文字と小文字を区別しません

クエリを検索しようとしていますが、完全一致検索では問題なく機能しますが、ElasticSearchでは大文字と小文字が区別されないため、ユーザーが小文字または大文字を入力しても機能しません。

{
    "query" : {
        "bool" : { 
            "should" : {
                "match_all" : {} 
            },
            "filter" : {
                "term" : { 
                    "city" : "pune"
                }
            }
        }
    }
}

市が正確に「プネ」である場合は問題なく機能しますが、テキストを「PUNE」に変更しても機能しません。

4
Rohit

Elasticsearchは、カスタムマッピングを定義しない限り、テキストフィールドを小文字で分析します。

正確な値(数値、日付、キーワードなど)は、フィールドで指定された正確な値を逆インデックスに追加して検索可能にします。

ただし、テキストフィールドは分析されます。これは、それらの値が最初にアナライザーに渡されて用語のリストを生成し、次にそれが転置インデックスに追加されることを意味します。テキストを分析する方法はたくさんあります。デフォルトの標準アナライザーはほとんどの句読点を削除し、テキストを個々の単語に分割し、小文字にします

参照: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html

したがって、用語クエリを使用する場合は、クエリを実行する前に、自分で用語--- 用語を分析 を使用してください。または、この場合は単に用語を小文字にします。

5
wp78de

ElasticSearchは大文字と小文字を区別しません。

「Elasticsearch」は大文字と小文字を区別しません。 JSON文字列プロパティは、デフォルトで text datatype としてマッピングされます( keyword datatypesub または multifield 、これについては後で説明します)。

textデータ型には、分析の概念が関連付けられています。インデックス時に、文字列入力は 分析チェーン を介して供給され、結果のtermsは、高速全文のために逆インデックスデータ構造に格納されます探す。アナライザーを指定していないtextデータ型では、デフォルトのアナライザー Standard Analyzer が使用されます。標準アナライザーのコンポーネントの1つは、トークンを小文字にする 小文字トークンフィルター です(terms)。

検索APIを介してElasticsearchにクエリを実行する場合、ほとんどすべてのユースケースに適合するように、使用するクエリにはさまざまな種類があります。 match、_multi_match_クエリなどの1つのクエリファミリは、フルテキストクエリです。これらのタイプのクエリは、検索時にクエリ入力の分析を実行し、結果の用語を転置インデックスに格納されている用語と比較します。デフォルトで使用されるアナライザーも標準アナライザーになります。

termtermsprefixクエリなどの別のクエリファミリは、用語レベルのクエリです。これらのタイプのクエリはクエリ入力を分析しないため、クエリ入力はそのまま転置インデックスに格納されている用語と比較されます。

あなたの例では、_"city"_フィールドに対するtermクエリは、大文字で入力してもインデックス時に分析を受けたtextフィールドに対して検索を行っているため、一致は見つかりません。デフォルトのマッピングでは、これがkeywordsubフィールドが役立つ場所です。 keywordデータ型は分析を受けません(まあ、それは normalizers で分析のタイプを持っているため、exactに使用できます)マッチング、およびソートと集計。これを使用するには、_"city.keyword"_フィールドをターゲットにする必要があります。別の方法として、_"city"_フィールドで使用されるアナライザーを小文字トークンフィルターを使用しないアナライザーに変更することもできます。このアプローチをとると、インデックス内のすべてのドキュメントのインデックスを再作成する必要があります。

5
Russ Cam

この問題を解決するには、カスタム正規化を作成し、マッピングを更新して追加します。

インデックスを削除して再度追加する前に

最初にインデックスを削除します

DELETE PUT http:// localhost:9200/users

今度はインデックスを再作成します

PUT http:// localhost:9200/users

{
  "settings": {
    "analysis": {
      "normalizer": {
        "lowercase_normalizer": {
          "type": "custom",
          "char_filter": [],
          "filter": ["lowercase", "asciifolding"]
        }
      }
    }
  },
  "mappings": {
    "user": {
      "properties": {
        "city": {
          "type": "keyword",
          "normalizer": "lowercase_normalizer"
        }
      }
    }
  }
}
1
Rohit