如何使elasticsearch忽略某些查询之间的空格?

时间:2015-01-23 09:31:56

标签: elasticsearch query-analyzer

我的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"

我注意到这种任务的模式是忽略任何数字和任何单个字母字符之间的空格,并进行查询。例如,"I-phone 5s"也应该返回"I-phone 5 s"

有没有很好的方法来实现这个目标?

1 个答案:

答案 0 :(得分:2)

您需要更改分析器以在从文本到数字的更改中分解字符串 - 使用正则表达式会有所帮助(这基于camelcase analyser):

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
  } ]
}