我按如下方式创建了一个索引
PUT /ngram_tokenizer
{
"mappings": {
"properties": {
"test_name": {
"type": "text",
"analyzer": "my_analyzer"
}
}
},
"settings": {
"index": {
"max_ngram_diff": 20
},
"analysis": {
"tokenizer": {
"my_tokenizer": {
"type": "ngram",
"min_gram": 2,
"max_gram": 20,
"token_chars":[
"letter",
"digit",
"whitespace",
"symbol"
]
}
},
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer"
}
}
}
}
}
然后按如下方式进行索引
POST /ngram_tokenizer/_doc
{
"test_name": "test document"
}
POST /ngram_tokenizer/_doc
{
"test_name": "another document"
}
然后我执行了一个Match_Phrase查询,
GET /ngram_tokenizer/_search
{
"query": {
"match_phrase": {
"test_name": "document"
}
}
}
上面的查询按预期返回两个文档,但下面的查询没有返回任何文档
GET /ngram_tokenizer/_search
{
"query": {
"match_phrase": {
"test_name": "test"
}
}
}
此外,我还通过以下查询检查了它生成的所有令牌
POST ngram_tokenizer/_analyze
{
"analyzer": "my_analyzer",
"text": "test document"
}
匹配查询很好,你们能帮我吗
更新
当我想要搜索一个短语时,我必须执行Match_Phrase查询,对吗?然后,我在该字段上使用了n-gram标记器,因为,如果搜索词中有任何拼写错误,我仍然可以得到类似的文档。此外,我知道我们可以使用模糊性来克服搜索词中的打字错误问题。但当我在匹配查询或模糊查询中使用模糊性时,就会出现这里提到的得分问题。实际上,我想要的是,当我进行匹配查询时,我希望得到结果,即使搜索术语中有拼写错误。在Match_Phrase查询中,至少当我搜索时没有任何输入错误时,我应该会得到正确的结果。
1条答案
按热度按时间bqucvtff1#
这是因为在搜索时,用于分析输入文本的分析器与索引时使用的分析器相同,即
my_analyzer
,而match_phrase
查询比match
查询稍微复杂一些。在搜索时,您只需使用
standard
分析器(或与ngram分析器不同的其他工具)来分析您的查询输入。下面的查询显示了如何使其按照您的预期工作。
您还可以在Map中将
standard
分析器指定为search_analyzer