我需要使用弹性搜索基于信用卡号码的后四位数进行搜索。与sql LIKE类似。在此先感谢
答案 0 :(得分:1)
对字符串末尾的字符进行通配符/正则表达式搜索(在注释中建议)效率非常低。
相反,你应该:
因此,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"} }
}'