【发布时间】:2020-05-16 19:11:41
【问题描述】:
我有一些带有 id 属性的记录,所以我需要使用 Elasticsearch 搜索我的 id 字段。但是用户没有确切的 id,所以一旦用户尝试使用部分数字,如果它部分匹配应该返回结果。
例如,Id 是 1234,一旦我输入 12 应该返回这条记录 知道如何为数字值执行包含 (*) 行为的字符串吗?
【问题讨论】:
标签: elasticsearch elasticsearch-query
我有一些带有 id 属性的记录,所以我需要使用 Elasticsearch 搜索我的 id 字段。但是用户没有确切的 id,所以一旦用户尝试使用部分数字,如果它部分匹配应该返回结果。
例如,Id 是 1234,一旦我输入 12 应该返回这条记录 知道如何为数字值执行包含 (*) 行为的字符串吗?
【问题讨论】:
标签: elasticsearch elasticsearch-query
如果您关心前缀搜索,即 id 1234,仅当用户开始搜索 12 时,它应该返回 id 而不是 23,那么它的性能会更高,并且可以使用perfix query 在 Elasticsearch 中。
如果你想要1234,即使用户错过了开始字符并搜索23,那么你可以需要使用n-gram tokenizer创建一个自定义分析器,它将创建像12、23这样的标记, 34, 123, 234 这样你也可以提供中缀搜索。
注意:prefix queries 和 n-gram tokenizer 均不适用于数字字段。您需要将您的用户 ID 存储在文本字段中以使其正常工作。
n-gram tokenizer 在评论中要求的工作示例
索引定义
{
"settings": {
"index.max_ngram_diff": 10,
"analysis": {
"filter": {
"autocomplete_filter": {
"type": "ngram",
"min_gram": 1,
"max_gram": 10
}
},
"analyzer": {
"autocomplete": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"autocomplete_filter"
]
}
}
}
},
"mappings": {
"properties": {
"uid": {
"type": "text",
"analyzer": "autocomplete",
"search_analyzer" : "standard"
}
}
}
}
索引示例文档
{
"uid" : "1234"
}
**搜索查询12 **
{
"query": {
"match" : {
"uid" : {
"query" : "12"
}
}
}
}
结果
"hits": [
{
"_index": "intdata",
"_type": "_doc",
"_id": "1",
"_score": 0.45532417,
"_source": {
"uid": "1234"
}
}
]
同样,它会返回 23、123、34 等的结果
【讨论】: