有没有办法在ElasticSearch中要求完整(但不一定完全匹配)?
例如,如果某个字段的字词为"I am a little teapot short and stout"
,我希望在" i am a LITTLE TeaPot short and stout! "
上匹配,而不仅仅是"teapot short and stout"
。我已尝试使用术语过滤器,但这需要实际完全匹配。
答案 0 :(得分:1)
如果你的“不一定完全”的定义是指大写/小写字母组合和标点符号(如你的例子中的!
),这将是一个解决方案,不是太简单和明显的难度:< / p>
映射:
{
"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! "
}
}
}