我正在尝试构建具有数百万个可能值的自动填充。我设法用两种不同的方法match和ngram做到了。问题是匹配要求用户键入整个单词,而ngram返回的结果很差。如果没有匹配结果,是否有办法只返回ngram结果?
方法1:匹配
返回非常相关的结果,但要求用户键入完整的单词
//mapping
analyzer: {
std_english: {
type: 'standard',
stopwords: '_english_',
},
}
//search
query: {
bool: {
must: [
{ term: { semanticTag: type } },
{ match: { search } }
]}
}
方法2:ngram
返回差的比赛
//mapping
analysis: {
filter: {
autocomplete_filter: {
type: 'edge_ngram',
min_gram: 1,
max_gram: 20,
},
},
analyzer: {
autocomplete: {
type: 'custom',
tokenizer: 'standard',
filter: ['lowercase', 'autocomplete_filter'],
},
},
//search
query: {
bool: {
must: [
{ term: { semanticTag: type } },
{ match: {
term: {
query: search,
operator: 'and',
}
}
}
]}
}
答案 0 :(得分:0)
尝试将查询更改为类似的内容-
{
"query": {
"bool": {
"must": [
{
"term": {
"semanticTag": "type"
}
},
{
"match_phrase_prefix": {
"fieldName": {
"query": "valueToSearch"
}
}
}
]
}
}
}
您可以使用match_phrase_prefix
,通过使用该用户将不需要键入整个单词,用户键入的所有内容以及以索引字段数据开头的内容都将返回。
请注意,这还将从索引文档中的任何可用中间词中提取结果。
例如如果在一个字段中索引的数据类似于-"lorem ipsum"
并且用户类型为"ips"
,那么您将获得整个文档以及以"ips"
开头的其他文档
您可以使用标准分析仪或定制分析仪,必须检查哪种分析仪更适合您的用例。根据有问题的信息,以上给出的方法适用于standard analyzer
。