我在我的弹性搜索索引上使用了ngram分析器。这是我所需要的搜索能力所必需的。我正在搜索一个名为"l/test_V0001“的文档。当我使用"l/test“进行搜索时,我只能得到"l”的结果,/是一个转义字符,而不是一个文本。我已经搜索并发现这是一个常见的问题和预期,但找不到解决办法。
当我在API中搜索"l/test_V0001“时,我可以找到我想要的结果。然而,当通过java API执行相同的搜索时,我仍然只能得到"l“的结果。
以下是API搜索:
{
"query": {
"multi_match": {
"query": "l/test_V0001",
"fields": ["name", "name.partial", "name.text"]
}
}
}和索引的映射:
{
"settings": {
"index": {
"max_ngram_diff": 20,
"search.idle.after": "10m"
},
"analysis": {
"analyzer": {
"ngram3_analyzer": {
"tokenizer": "ngram3_tokenizer",
"filter": [
"lowercase"
]
}
},
"tokenizer": {
"ngram3_tokenizer": {
"type": "ngram",
"min_gram": 3,
"max_gram": 20
}
}
}
},
"mappings": {
"dynamic": "strict",
"properties": {
"name": {
"type": "keyword",
"fields": {
"partial": {
"type": "text",
"analyzer": "ngram3_analyzer",
"search_analyzer": "keyword"
},
"text": {
"type": "text"
}
}
},
"value": {
"type": "integer"
}
}
}
}这方面的任何帮助或解决办法都是很棒的!
发布于 2021-01-22 00:03:24
因此,经过一些挖掘,我找到了使用自定义令牌字符的答案。这已添加到索引映射中:
"tokenizer": {
"ngram3_tokenizer": {
"type": "ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": [
"letter",
"digit",
"symbol",
"custom"
],
"custom_token_chars": "/"
}所以我的完整索引现在看起来是这样的:
{
"settings": {
"index": {
"max_ngram_diff": 20,
"search.idle.after": "10m"
},
"analysis": {
"analyzer": {
"ngram3_analyzer": {
"tokenizer": "ngram3_tokenizer",
"filter": [
"lowercase"
]
}
},
"tokenizer": {
"ngram3_tokenizer": {
"type": "ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": [
"letter",
"digit",
"symbol",
"custom"
],
"custom_token_chars": "/"
}
}
}
},
"mappings": {
"dynamic": "strict",
"properties": {
"name": {
"type": "keyword",
"fields": {
"partial": {
"type": "text",
"analyzer": "ngram3_analyzer",
"search_analyzer": "keyword"
},
"text": {
"type": "text"
}
}
},
"value": {
"type": "integer"
}
}
}
}这对rest客户端和java API都有效。
https://stackoverflow.com/questions/65790904
复制相似问题