我在弹性搜索中存储了一个“付款参考号”。
它的布局是例如: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
有人可以告诉我如何将此字段映射到我要实现的两种类型的搜索吗?
更新 - 答案
实际上是瓦尔在下面所说的。我只是稍微更改了映射以更具体地分析分析器,而且我不需要索引主字符串,因为我只查询部分。
映射
"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"
},