在弹性搜索中搜索列数据的最后四位数

时间:2015-03-30 07:57:55

标签: java elasticsearch

我需要使用弹性搜索基于信用卡号码的后四位数进行搜索。与sql LIKE类似。在此先感谢

1 个答案:

答案 0 :(得分:1)

对字符串末尾的字符进行通配符/正则表达式搜索(在注释中建议)效率非常低。

相反,你应该:

  1. 反转分析器中的字符串
  2. 使用前缀搜索
  3. 搜索字符串

    因此,123456789将被编入索引为987654321 - 然后您还将搜索字词6789反转为9876,并对{{1}进行前缀搜索反对9876

    要在Elasticsearch中进行设置,它比听起来更简单:

    创建索引并定义一个新的分析器,它将在存储时反转数据:

    987654321

    在映射中引用分析器:

    curl -XDELETE 'http://localhost:9200/test'
    
    curl -XPOST 'http://localhost:9200/test' -d '{
        "analysis": {
           "analyzer": {
                "suffix_analyzer": {
                    "filter": ["lowercase", "reverse"],
                    "tokenizer": "keyword",
                    "type": "custom"}
          }
       }
    }'
    

    发布一些数据(请注意,卡片号不是反转):

    curl -XPUT "http://localhost:9200/test/creditcard/_mapping" -d' {
        "creditcard" : {
          "properties": {
              "cardnumber":{"type" : "string", "analyzer" : "suffix_analyzer"}
            }
        }
    }'
    

    然后使用match_phrase_prefix查询数据:

    curl -XPOST 'http://localhost:9200/test/creditcard' -d'
    {
       "cardnumber": "1234567890"
     }'
    

    然后你应该收回你的数据:

    curl -XGET 'http://localhost:9200/test/creditcard/_search?pretty' -d '{
     "query": { "match_phrase_prefix": { "cardnumber" : "7890"} }
    }'