我在查询数据库中是否存在“ford”时遇到问题,并且搜索“fordddddddd”时会返回匹配项。我有ngram可以对诸如“fo”,“for”,“ford”之类的查询进行部分匹配,但“fordddddd”不应该匹配。可能是什么问题?以下是我的设置,映射和查询。
设定:
settings: {
number_of_shards: 1,
analysis: {
filter: {
ngram_filter: {
type: 'edge_ngram',
min_gram: 2,
max_gram: 15
}
},
analyzer: {
ngram_analyzer: {
type: 'custom',
tokenizer: 'standard',
filter: [
'lowercase',
'ngram_filter'
]
}
}
}
}
对应:
mappings: [
{
name: 'car',
_all: {
type: 'string',
analyzer: 'ngram_analyzer'
},
properties: {
description: {
properties: {
name: {
type: 'string',
include_in_all: true,
term_vector: 'yes',
analyzer: 'ngram_analyzer'
},
model: {
type: 'string',
include_in_all: true,
term_vector: 'yes',
analyzer: 'ngram_analyzer'
}
}
}
}
}
]
查询:
GET car/_search
{
"query": {
"match": {
"_all": {
"query": "Forddddddd"
}
}
}
}
最佳答案
这里的问题是,您为analyzer
和indexing
使用相同的searching
。
当您搜索Forddddd
时,会应用ngram_analyzer
并生成fo,for,for的 token ,因此它为您提供结果,您应指定standard analyzer
进行搜索,您将获得所需的结果。
properties: {
name: {
type: 'string',
include_in_all: true,
term_vector: 'yes',
analyzer: 'ngram_analyzer',
search_analyzer: 'standard' <--- here
},
model: {
type: 'string',
include_in_all: true,
term_vector: 'yes',
analyzer: 'ngram_analyzer',
search_analyzer: 'standard' <--- here
}
}
关于search - ElasticSearch问题与匹配结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34346624/