我在弹性搜索中有数据存储为
field1:DAVID'S RD
field1:DAVID's PARK
field1:DAVID'S JUNCTION
field1:DAVID'S REST
.......
..............
案例 1:
如果输入是DAVID’S
(撇号字符不同的地方)。它没有以正确的顺序返回结果,结果中缺少某些记录。
案例2:
如果输入是 DAVID'S
,则给出正确的结果。
案例3:
如果输入是 DAVIDS
。它再次给出与 case1 相同的响应。
那么,如何在弹性搜索中处理所有三种情况。
答案 0 :(得分:0)
我在这里的建议是对您的 field1 使用 english analyzer,这将标准化根“david”的所有变体。
标准分析器会按原样考虑这 3 种变化。
GET /_analyze
{
"text": ["DAVID'S", "DAVID’S", "DAVIDS"],
"analyzer": "standard"
}
{
"tokens" : [
{
"token" : "david's",
"start_offset" : 0,
"end_offset" : 7,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "david’s",
"start_offset" : 8,
"end_offset" : 15,
"type" : "<ALPHANUM>",
"position" : 1
},
{
"token" : "davids",
"start_offset" : 16,
"end_offset" : 22,
"type" : "<ALPHANUM>",
"position" : 2
}
]
}
但是英语分析器会理解这三个的根源。
GET /_analyze
{
"text": ["DAVID'S", "DAVID’S", "DAVIDS"],
"analyzer": "english"
}
{
"tokens" : [
{
"token" : "david",
"start_offset" : 0,
"end_offset" : 7,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "david",
"start_offset" : 8,
"end_offset" : 15,
"type" : "<ALPHANUM>",
"position" : 1
},
{
"token" : "david",
"start_offset" : 16,
"end_offset" : 22,
"type" : "<ALPHANUM>",
"position" : 2
}
]
}
要设置此分析器,您可以使用此设置创建索引。
PUT test_rahul
{
"mappings": {
"properties": {
"field1": {
"type": "text",
"analyzer": "english"
}
}
}
}
测试文档
POST test_rahul/_doc
{
"field1": "DAVID'S RD"
}
查询
POST test_rahul/_search
{
"query": {
"match": {
"field1": "davids"
}
}
}
回复
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.2876821,
"hits" : [
{
"_index" : "test_rahul",
"_type" : "_doc",
"_id" : "TNCY_ncB46EpgstaBC3E",
"_score" : 0.2876821,
"_source" : {
"field1" : "DAVID'S RD"
}
}
]
}
}
如果您只想过滤掉撇号,那么您可以使用 Apostrophe Filter,但英语分析器通常效果很好。