我正在使用 Elasticsearch,我有一个索引,其中包含带有字母数字组合的条目,例如“Hotel101 fort”。当我使用“Hotel 101 fort”这样的查询进行搜索时,我没有得到正确的结果,因为 Elasticsearch 将查询拆分为单独的标记,例如“Hotel”、“101”和“fort”,但索引文档已标记化如“Hotel101”和“fort”。
我的目标是确保文档中的“Hotel101”与“Hotel 101 fort”之类的查询匹配,而无需在查询中显式指定分析器。这是我迄今为止尝试过的:
我正在使用 multi_match 查询来跨多个字段进行搜索。 我已经使用 ngram 和同义词过滤器定义了自定义分析器,但问题仍然存在。
我尝试过的: 我尝试使用 ngram 进行部分匹配,但这对字母数字组合的完整标记化没有帮助。 我还使用了同义词过滤器,但随后我必须将所有可能的字母数字实例输入到同义词列表中,这似乎非常低效。
如何配置 Elasticsearch 在索引和查询过程中将诸如“Hotel101”和“Hotel 101”之类的字母数字组合处理为相同的标记,而无需在每个查询中指定分析器?
您需要将单词分隔符标记过滤器与自定义分析器一起使用。
以下是示例配置:
索引映射:
PUT test3
{
"settings": {
"analysis": {
"analyzer": {
"my_custom_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"word_delimiter"
]
}
}
}
},
"mappings": {
"properties": {
"title":{
"type": "text",
"analyzer": "my_custom_analyzer"
}
}
}
}
示例文档:
POST test3/_doc/1
{
"title":"Hotel101 fort"
}
示例查询:
POST test3/_search
{
"query": {
"match": {
"title": "Hotel 101 fort"
}
}
}
回复:
{
"hits": [
{
"_index": "test3",
"_id": "1",
"_score": 0.8630463,
"_source": {
"title": "Hotel101 fort"
}
}
]
}