1

私のelasticsearchドキュメントには、次のNameようなエントリを持つフィールドがあります:

Samsung Galaxy S3
Samsung Galaxy Ace Duos 3
Samsung Galaxy Duos 3
Samsung Galaxy S2
Samsung Galaxy S (I9000)

次のクエリでこのフィールドをクエリすると(「s」と「3」の間のスペースに注意してください) :

{
  "query": {
    "match": {
      "Name": {
        "query": "galaxy s 3",
        "fuzziness": 2,
        "prefix_length": 1
      }
    }
  }
}

"Samsung Galaxy Duos 3"ではなく、関連する結果として返されます"Samsung Galaxy S3"

このようなタスクで私が気付くパターンは、任意の数字と任意の 1 つのアルファベット文字の間のスペースを無視して、クエリを作成することです。たとえば、"I-phone 5s"によっても返される必要があります"I-phone 5 s"

これを達成する良い方法はありますか?

4

1 に答える 1

2

テキストから数値への変更時に文字列を分割するようにアナライザーを変更する必要があります。正規表現を使用すると役立ちます (これはcamelcase アナライザーに基づいています)。

curl -XPUT 'localhost:9200/myindex/' -d '
     {
         "settings":{
             "analysis": {
                 "analyzer": {
                     "mynewanalyser":{
                         "type": "pattern",
                         "pattern":"([^\\p{L}\\d]+)|(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)"
                     }
                 }
             }
         }
     }'

文字列を使用して新しいアナライザーをテストします。

-XGET 'localhost:9200/myindex/_analyze?analyzer=mynewanalyser&pretty' -d 'Samsung Galaxy S3'
{
  "tokens" : [ {
    "token" : "samsung",
    "start_offset" : 0,
    "end_offset" : 7,
    "type" : "word",
    "position" : 1
  }, {
    "token" : "galaxy",
    "start_offset" : 8,
    "end_offset" : 14,
    "type" : "word",
    "position" : 2
  }, {
    "token" : "s",
    "start_offset" : 15,
    "end_offset" : 16,
    "type" : "word",
    "position" : 3
  }, {
    "token" : "3",
    "start_offset" : 16,
    "end_offset" : 17,
    "type" : "word",
    "position" : 4
  } ]
}
于 2015-01-23T15:57:14.957 に答える