【发布时间】:2017-07-13 10:29:05
【问题描述】:
我在 elasticsearch 中存储了一个“付款参考号”。
它的布局例如:2-4-3-635844569819109531 或 2-4-2-635844533758635433 等
我希望能够通过付款参考号搜索文档
- 使用“整体”参考编号进行搜索,例如输入
2-4-2-635844533758635433 - 从“开始”开始的参考编号的任何“部分”。例如。
2-4-2-63(.. 所以在例子中只返回第二个)
注意:我不想搜索“中间”或“结尾”等。仅从开头开始。
无论如何,连字符让我感到困惑。
问题
1) 我不确定是否应该在映射中删除它们,例如
"char_filter" : {
"removeHyphen" : {
"type" : "mapping",
"mappings" : ["-=>"]
}
},
或者不。我从来没有以这种方式使用过映射,所以不确定这是否有必要。
2) 我认为我需要一个“ngrams”过滤器,因为我希望能够从存在中搜索参考编号的一部分。我觉得像
"partial_word":{
"filter":[
"standard",
"lowercase",
"name_ngrams"
],
"type":"custom",
"tokenizer":"whitespace"
},
和过滤器
"name_ngrams":{
"side":"front",
"max_gram":50,
"min_gram":2,
"type":"edgeNGram"
},
我不知道如何把它们放在一起,但是
"paymentReference":{
"type":"string",
"analyzer": "??",
"fields":{
"partial":{
"search_analyzer":"???",
"index_analyzer":"partial_word",
"type":"string"
}
}
}
我尝试过的一切似乎总是在第二个搜索案例中“中断”。
如果我这样做 'localhost:9200/orders/_analyze?field=paymentReference&pretty=1' -d "2-4-2-635844533758635433" 它总是打破连字符作为它自己的标记并返回例如所有带有2- 的文件都“很多”!而不是我在搜索2-4-2-6时想要的
谁能告诉我如何将此字段映射到我想要实现的两种搜索类型?
更新 - 回答
Val 在下面所说的很有效。我只是稍微更改了映射以更具体地分析分析器,而且我不需要索引主字符串,因为我只查询部分。
映射
"paymentReference":{
"type": "string",
"index":"not_analyzed",
"fields": {
"partial": {
"search_analyzer":"payment_ref",
"index_analyzer":"payment_ref",
"type":"string"
}
}
}
分析器
"payment_ref": {
"type": "custom",
"filter": [
"lowercase",
"name_ngrams"
],
"tokenizer": "keyword"
}
过滤器
"name_ngrams":{
"side":"front",
"max_gram":50,
"min_gram":2,
"type":"edgeNGram"
},
【问题讨论】:
标签: elasticsearch elasticsearch-mapping