6

ハイフンを含むフィールドでワイルドカードを使用してクエリ文字列を検索できるように、elasticsearch を構成する方法を考えています。

次のようなドキュメントがあります。

{
   "tags":[
      "deck-clothing-blue",
      "crew-clothing",
      "medium"
   ],
   "name":"Crew t-shirt navy large",
   "description":"This is a t-shirt",
   "images":[
      {
         "id":"ba4a024c96aa6846f289486dfd0223b1",
         "type":"Image"
      },
      {
         "id":"ba4a024c96aa6846f289486dfd022503",
         "type":"Image"
      }
   ],
   "type":"InventoryType",
   "header":{
   }
}

word_delimiter フィルターと空白トークナイザーを使用しようとしました。

{
"settings" : {
    "index" : {
        "number_of_shards" : 1,
        "number_of_replicas" : 1
    },  
    "analysis" : {
        "filter" : {
            "tags_filter" : {
                "type" : "word_delimiter",
                "type_table": ["- => ALPHA"]
            }   
        },
        "analyzer" : {
            "tags_analyzer" : {
                "type" : "custom",
                "tokenizer" : "whitespace",
                "filter" : ["tags_filter"]
            }
        }
    }
},
"mappings" : {
    "yacht1" : {
        "properties" : {
            "tags" : {
                "type" : "string",
                "analyzer" : "tags_analyzer"
            }
        }
    }
}
}

ただし、これらは検索 (タグの場合) とその結果です。

deck*     -> match
deck-*    -> no match
deck-clo* -> no match

誰かが私が間違っているところを見ることができますか?

ありがとう :)

4

1 に答える 1

9

アナライザーは問題ありませんが (フィルターは失われます)、検索アナライザーが指定されていないため、標準のアナライザーを使用してタグ フィールドを検索し、ハイフンを取り除き、それに対してクエリを実行しようとします (実行curl "localhost:9200/_analyze?analyzer=standard" -d "deck-*"して何が表示されるかを確認します)。つまり)

基本的に、「deck-*」は「deck *」として検索されており、「deck」だけを含む単語は存在しないため、失敗します。

「deck-clo*」は「deck clo*」として検索されますが、ここでも「deck」または「clo」で始まる単語がないため、クエリは失敗します。

次の変更を加えます

"analysis" : {
    "analyzer" : {
        "default" : {
            "tokenizer" : "whitespace",
            "filter" : ["lowercase"] <--- you don't need this, just thought it was a nice touch
        }
    }
}

次に、タグの特別なアナライザーを取り除きます

"mappings" : {
    "yacht1" : {
        "properties" : {
            "tags" : {
                "type" : "string"
            }
        }
    }
}

それがどうなるか教えてください。

于 2013-05-25T05:26:21.753 に答える