我有一个包含单词的标签数组。
tags: ['australianbrownsnake', 'venomoussnake', ...]
如何将其与以下搜索字词匹配: “棕色蛇”,“澳大利亚蛇”,“有毒”,“有毒棕色蛇”
我什至不确定这是否可行,因为我是Elasticsearch的新手。 帮助将不胜感激。谢谢。
编辑:我创建了一个ngram分析器,并添加了一个名为ngram的字段,如下所示。
properties": {
"tags": {
"type": "text",
"fields": {
"ngram": {
"type": "text",
"analyzer": "my_analyzer"
}
}
}
我尝试了以下查询,但是没有运气
"query": {
"multi_match": {
"query": "snake",
"fields": [
"tags.ngram"
],
"type": "most_fields"
}
}
我的标签映射如下:
"tags" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
},
"ngram" : {
"type" : "text",
"analyzer" : "my_analyzer"
}
}
},
我的设置是:
{
"image" : {
"settings" : {
"index" : {
"max_ngram_diff" : "10",
"number_of_shards" : "1",
"provided_name" : "image",
"creation_date" : "1572590562106",
"analysis" : {
"analyzer" : {
"my_analyzer" : {
"tokenizer" : "my_tokenizer"
}
},
"tokenizer" : {
"my_tokenizer" : {
"token_chars" : [
"letter",
"digit"
],
"min_gram" : "3",
"type" : "ngram",
"max_gram" : "10"
}
}
},
"number_of_replicas" : "1",
"uuid" : "pO9F7W43QxuZmI9vmXfKyw",
"version" : {
"created" : "7040299"
}
}
}
}
}
更新:
此配置应该可以正常工作。 我相信那是我的错。我搜索了错误的索引
答案 0 :(得分:1)
您需要以想要搜索标签的方式为标签建立索引。对于诸如“棕色蛇”,“澳大利亚蛇”之类的查询来匹配您的标签,您需要将它们分成较小的标记。
默认情况下,elasticsearch将字符串通过其标准分析器进行索引。您始终可以创建自定义分析器来存储所需的字段。您可以创建自定义分析器,将字符串标记化为nGrams。您可以指定3-10的大小,以将“ australianbrownsnake”标签存储为类似以下内容:['aus','aust',...,'tra','tral',...]
然后,您可以修改搜索查询以使其与tags.ngram
字段相匹配,您将获得所需的结果。
可以像这样创建tags.ngrams
字段:
https://www.elastic.co/guide/en/elasticsearch/reference/current/multi-fields.html
使用ngram标记程序:
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-edgengram-tokenizer.html
EDIT1:Elastic倾向于使用要匹配的字段的分析器来分析查询关键字。您可能不需要在nGrams中对用户查询进行标记化,因为在tag字段中应该存储有匹配的nGram。您可以在映射中指定标准search_analyzer
。