1

EdgeNGram アナライザーを使用して、フィールドで大文字と小文字を区別しない検索を行いたいと考えています。Elastica経由で ES を php で使用しています。

ユーザーのテーブルがあります

{
   "user": {
      "analyzer": "analyzer_edgeNGram",
      "properties": {
         "admin": {
            "type": "boolean"
         },
         "firstName": {
            "type": "string",
            "analyzer": "analyzer_edgeNGram"
         },
         "lastName": {
            "type": "string",
            "analyzer": "analyzer_edgeNGram"
         },
         "username": {
            "type": "string",
            "analyzer": "analyzer_edgeNGram"
         }
      }
   }
}

私のアナライザーは次のようになります (egdeNGram アナライザーに小文字フィルターがあることがわかります)。

         "index.analysis.filter.asciifolding.type": "asciifolding",
         "index.number_of_replicas": "1",
         "index.analysis.filter.standard.type": "standard",
         "index.analysis.tokenizer.edgeNGram.token_chars.1": "digit",
         "index.analysis.tokenizer.edgeNGram.max_gram": "10",
         "index.analysis.analyzer.analyzer_edgeNGram.type": "custom",
         "index.analysis.tokenizer.edgeNGram.token_chars.0": "letter",
         "index.analysis.filter.lowercase.type": "lowercase",
         "index.analysis.tokenizer.edgeNGram.side": "front",
         "index.analysis.tokenizer.edgeNGram.type": "edgeNGram",
         "index.analysis.tokenizer.edgeNGram.min_gram": "1",
         "index.analysis.tokenizer.standard.type": "standard",
         "index.analysis.analyzer.analyzer_edgeNGram.filters": "standard,lowercase,asciifolding",
         "index.analysis.analyzer.analyzer_edgeNGram.tokenizer": "edgeNGram",
         "index.number_of_shards": "1",
         "index.version.created": "900299"

たとえば、firstName Miroslav のユーザーがいます。このようなクエリを実行すると

{"query": {"match": {"firstName": "miro"}}}

ヒット数が 0 です。しかし、クエリ miro を Miro に変更すると、見つかります。トークンがどのように生成され、大文字と小文字が区別されるかを確認しました: M、Mi、Mir、...

大文字と小文字を区別しない検索を実現する方法について何かアドバイスはありますか? ありがとうございました

4

1 に答える 1