” 在Elasticsearch中设计索引,以使查询中的“&”和“ and”返回相同的结果”
无论使用“ 和”作为查询字符串还是使用“&”和“ &”进行搜索,我们如何使Elasticsearch返回相同的结果。
例如,有一个查询来查找名称中包含“ 和/&”的所有电影标题。
因此,在这种情况下,查询中是否使用“ and”或“&”进行搜索都应该返回1,2,3。
从我的Kibana开发工具中转储
PUT test_index { “ settings”:{“ number_of_replicas”:0, “碎片数”:1 }, “映射”:{ “ doc”: { “属性”:{ “ movie_name”:{“ type”:“ text”} } } } }
PUT / test_index / doc / 1 { “ movie_name”:“史密斯先生和夫人” }
PUT / test_index / doc / 2 { “ movie_name”:“杰克和吉尔” }
PUT / test_index / doc / 3 { “ movie_name”:“ Abc和Def&ghi” }
PUT / test_index / doc / 4 { “ movie_name”:“虚拟名称” }
以下两个查询应返回相同的结果
获取test_index / _search { “大小”:20, “查询”:{ “比赛”: { “ movie_name”:“&” } } }
获取test_index / _search { “大小”:20, “查询”:{ “比赛”: { “ movie_name”:“和” } } }
答案 0 :(得分:3)
有两种方法可以做到这一点
使用 english 分析器,该分析器将删除文本中的特殊字符以及停用词(例如“ and”),因此实质上,您的搜索将与不带&/的标记匹配因此将是相同的。有关帮助文档,请参见https://www.elastic.co/guide/en/elasticsearch/reference/6.4/analysis-lang-analyzer.html
保留您的标准分析器,并添加一个字符替换过滤器,以将任何出现的“&”模式替换为“和”,然后所有这些搜索将发出相同的标记。有关帮助文档,请参见https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-pattern-replace-charfilter.html
答案 1 :(得分:0)
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "keyword",
"char_filter": [
"my_char_filter"
]
}
},
"char_filter": {
"my_char_filter": {
"type": "mapping",
"mappings": [
"+ => plus",
"& => and"
]
}
}
}
}
}
您应该创建char过滤器来执行此操作。
使用上述分析器创建索引
POST my_index/_analyze
{
"analyzer": "my_analyzer",
"text": "&"
}
输出:
{
"tokens": [
{
"token": "and",
"start_offset": 0,
"end_offset": 1,
"type": "word",
"position": 0
}
]
}
如果在没有上述字符过滤器分析器的情况下运行上述分析,您将获得
{
"tokens": []
}
原因:在ES中-使用文本类型创建字段时,符号被删除。