ElasticSearch 使用模式分析器搜索特殊字符
ElasticSearch search for special characters with pattern analyzer
我目前正在使用一个自定义分析器,并将分词器设置为模式 (\W|_)+
所以每个术语都只是字母,并在任何非字母上拆分。例如,我有一个包含内容 [dbo].[Material_Get]
的文档和另一个包含 dbo.Another_Material_Get
的文档。我希望能够搜索 "Material_Get" 并同时搜索到这两个文档,但是如果我搜索“[Material_Get]”,它仍然会搜索到 dbo.Another_Material_Get
,即使它没有里面没有括号。另外,如果我搜索 "Material Get"(在引用的搜索中),我应该不会得到任何结果,因为它们都没有那个短语。
我可以满足于 analyzer/tokenizer,只要文件中的任何地方有输入字符串,即使它旁边有其他内容,它也会找到。例如,搜索 "aterial_get" 将在两者中匹配。可以做我的任何一个案例吗?
根据你的解释,我得到的是你想要进行部分匹配,就像搜索 "aterial_get" 一样。
为了满足您的所有要求,您需要将字段的映射更改为在分析器中具有 ngram token filter 并且不删除特殊字符。样品分析仪可以看起来像
{
"settings":{
"analysis":{
"analyzer":{
"partialmatch":{
"type":"custom",
"tokenizer":"keyword",
"filter":[ "lowercase", "ngram" ]
}
},
"filter":{
"ngram":{
"type":"ngram",
"min_gram":2,
"max_gram":15
}
}
}
}
}
并在 your_field
的映射中定义上面定义的分析器 "partialmatch"。您可以根据需要更改 min_gram
和 max_gram
的值。
使用此映射,您可以进行如下所示的常规术语搜索
{
"term": {
"your_field": "aterial_get"
}
}
我目前正在使用一个自定义分析器,并将分词器设置为模式 (\W|_)+
所以每个术语都只是字母,并在任何非字母上拆分。例如,我有一个包含内容 [dbo].[Material_Get]
的文档和另一个包含 dbo.Another_Material_Get
的文档。我希望能够搜索 "Material_Get" 并同时搜索到这两个文档,但是如果我搜索“[Material_Get]”,它仍然会搜索到 dbo.Another_Material_Get
,即使它没有里面没有括号。另外,如果我搜索 "Material Get"(在引用的搜索中),我应该不会得到任何结果,因为它们都没有那个短语。
我可以满足于 analyzer/tokenizer,只要文件中的任何地方有输入字符串,即使它旁边有其他内容,它也会找到。例如,搜索 "aterial_get" 将在两者中匹配。可以做我的任何一个案例吗?
根据你的解释,我得到的是你想要进行部分匹配,就像搜索 "aterial_get" 一样。
为了满足您的所有要求,您需要将字段的映射更改为在分析器中具有 ngram token filter 并且不删除特殊字符。样品分析仪可以看起来像
{
"settings":{
"analysis":{
"analyzer":{
"partialmatch":{
"type":"custom",
"tokenizer":"keyword",
"filter":[ "lowercase", "ngram" ]
}
},
"filter":{
"ngram":{
"type":"ngram",
"min_gram":2,
"max_gram":15
}
}
}
}
}
并在 your_field
的映射中定义上面定义的分析器 "partialmatch"。您可以根据需要更改 min_gram
和 max_gram
的值。
使用此映射,您可以进行如下所示的常规术语搜索
{
"term": {
"your_field": "aterial_get"
}
}