我正在使用elasticSearch的以下设置和映射
{
"settings": {
"analysis": {
"filter": {
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 10
},
"synonym_filter": {
"type": "synonym",
"synonyms":[
"yoga,fit-sports,blue",
"tshirt,tees,t-shirt "
]
}
},
"analyzer": {
"autocomplete": {
"type": "custom",
"tokenizer": "whitespace",
"filter": [
"lowercase",
"synonym_filter",
"autocomplete_filter"
]
}
}
}
},
"mappings": {
"products": {
"properties": {
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
},
"analyzer": "autocomplete",
"search_analyzer": "standard"
}
}
}
}
}
我索引了一个字段“name:Princess Print T-shirt”。
正如使用空白分析器,es创建像“T恤”这样的标记。 但是为了搜索我正在使用“search_analyzer”:“标准”我认为这个查询就像“公主印花T恤”,这个“T恤”将不匹配,因此会给出空搜索结果。 我身边的一个解决方案就像添加“T恤,T恤”这样的同义词。然后我会得到结果。但在这种情况下,如果我们搜索“衬衫”,它将返回“T恤和衬衫”,这是不可接受的。 如果我没有使用这个“search_analyzer”:“标准”我没有得到预期的结果。 如果我搜索“T恤”,我只需要搜索结果
答案 0 :(得分:2)
问题部分如您所述[{1}}。
这会将"search_analyzer": "standard"
的每个条目转换为代币T-shirt
和t
。
索引中的数据看起来像shirt
,t-shirt
,依此类推,但不匹配。
您需要确保查询是小写的,在空白处拆分。
因此,您可以使用t-shir
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-whitespace-analyzer.html结合小写分析器为查询时间定义自定义分析器。