有没有办法在ElasticSearch中要求完整(尽管不一定精确)匹配?
例如,如果一个字段有术语"I am a little teapot short and stout"
,我想匹配," i am a LITTLE TeaPot short and stout! "
但不仅仅匹配"teapot short and stout"
。我已经尝试过过滤器一词,但这需要实际的完全匹配。
如果您的“不一定精确”定义是指大写/小写字母组合和标点符号(例如!
您在示例中所用的符号),那么这将是一个解决方案,不是太简单而且很明显:
映射:
{
"settings": {
"analysis": {
"analyzer": {
"my_keyword_lowercase": {
"tokenizer": "keyword",
"filter": [
"lowercase",
"trim",
"my_pattern_replace"
]
}
},
"filter": {
"my_pattern_replace": {
"type": "pattern_replace",
"pattern": "!",
"replacement":""
}
}
}
},
"mappings": {
"test": {
"properties": {
"text": {
"type": "string",
"analyzer": "my_keyword_lowercase"
}
}
}
}
}
这里的想法如下:
keyword
词器将文本保持原样,而不是将其拆分为分词lowercase
过滤器去除混合的大写/小写字符trim
用于除去尾随和前导空格的过滤器pattern_replace
过滤器消除标点符号。之所以这样,是因为keyword
令牌生成器不会对文本中的字符执行任何操作。一个standard
分析器会做到这一点,但standard
意志,也,而您需要它作为拆分文本这是您将用于上面的映射的查询:
{
"query": {
"match": {
"text": " i am a LITTLE TeaPot short and stout! "
}
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句