elasticsearch - 如何在弹性搜索文本搜索中匹配部分单词
问题描述
我的弹性搜索中有一个字段name
,其值为Single V
现在,如果我用S
or的值搜索它Sing
,我不会得到任何结果,但如果我输入一个完整的值Single
,那么我会得到结果Single V
,我正在使用的查询如下:-
{
"query": {
"match": {
"name": "singl"
}
},
"sort": []
}
这没有给我任何结果,我是否需要更改名称或分析器的映射/设置?
编辑:-
我正在尝试使用以下映射/设置创建以下索引
PUT my_cars
{
"settings": {
"analysis": {
"normalizer": {
"sortable": {
"filter": ["lowercase"]
}
},
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer"
},
"tokenizer": {
"my_tokenizer": {
"type": "ngram",
"min_gram": 1,
"max_gram": 36,
"token_chars": [
"letter"
]
}
}
}
}
},
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "my_analyzer",
"fields": {
"keyword": {
"type": "keyword",
"normalizer": "sortable"
}
}
}
}
}
}
但我收到以下错误
{
"error" : {
"root_cause" : [
{
"type" : "illegal_argument_exception",
"reason" : "analyzer [tokenizer] must specify either an analyzer type, or a tokenizer"
}
],
"type" : "illegal_argument_exception",
"reason" : "analyzer [tokenizer] must specify either an analyzer type, or a tokenizer"
},
"status" : 400
}
解决方案
如果没有指定分析器, Elasticsearch 默认使用标准分析器作为字段。text
这将标记"Single V"
为"single"
and "v"
。因此,您得到的是其他条款的结果,"Single"
而不是其他条款的结果。
如果要进行部分搜索,可以使用edge n-gram tokenizer或通配符查询
Edge n-gram 标记器的映射将是
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "edge_ngram",
"min_gram": 2,
"max_gram": 6,
"token_chars": [
"letter",
"digit"
]
}
}
},
"max_ngram_diff": 10
},
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "my_analyzer"
}
}
}
}
更新 1:
}
在上面给出的索引映射中,缺少一个括号。修改您的索引映射,如下所示
{
"settings": {
"analysis": {
"normalizer": {
"sortable": {
"filter": [
"lowercase"
]
}
},
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer"
}
}, // note this
"tokenizer": {
"my_tokenizer": {
"type": "ngram",
"min_gram": 1,
"max_gram": 36,
"token_chars": [
"letter"
]
}
}
},
"max_ngram_diff": 50
},
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "my_analyzer",
"fields": {
"keyword": {
"type": "keyword",
"normalizer": "sortable"
}
}
}
}
}
}
推荐阅读
- node.js - 如何使用从 Selenium Web 驱动程序中提取的值来创建和更新文件?
- ios - 自定义 AVPlayerViewController
- coldfusion - 在 ColdFusion 中,FileRead 会关闭它打开的文件吗?
- python - 以字符串形式获取 csv 标头
- android - 如何在适配器的片段中显示进度条
- file - 返回源文件夹的 Perl 代码不起作用
- c# - 为什么我在 c# 中的 do-while 循环不起作用?
- c - 二叉树产生分段错误
- ios - vscode 自定义 rn 模拟器设置坏了
- python - 代码中的运行时错误:树中的先序到后序