ElasticSearch 中的半精确(完全)匹配
Semi-exact (complete) match in ElasticSearch
有没有办法在 ElasticSearch 中要求完全(虽然不一定完全)匹配?
例如,如果一个字段有术语 "I am a little teapot short and stout"
,我想匹配 " i am a LITTLE TeaPot short and stout! "
而不仅仅是 "teapot short and stout"
。我试过术语过滤器,但这需要实际完全匹配。
如果您的 "not necessarily exact" 定义指的是 uppercase/lowercase 字母组合和标点符号(如您示例中的 !
),这将是一个解决方案,不是太简单和明显的艰难:
映射:
{
"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
过滤器去除混合 uppercase/lowercase 个字符
trim
用于去除尾随和前导空格的过滤器
- 使用
pattern_replace
过滤器去除标点符号。这是因为 keyword
分词器不会对文本中的字符做任何事情。 standard
分析器会执行此操作,但 standard
也会按原样拆分文本
这是您将用于上述映射的查询:
{
"query": {
"match": {
"text": " i am a LITTLE TeaPot short and stout! "
}
}
}
有没有办法在 ElasticSearch 中要求完全(虽然不一定完全)匹配?
例如,如果一个字段有术语 "I am a little teapot short and stout"
,我想匹配 " i am a LITTLE TeaPot short and stout! "
而不仅仅是 "teapot short and stout"
。我试过术语过滤器,但这需要实际完全匹配。
如果您的 "not necessarily exact" 定义指的是 uppercase/lowercase 字母组合和标点符号(如您示例中的 !
),这将是一个解决方案,不是太简单和明显的艰难:
映射:
{
"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
过滤器去除混合 uppercase/lowercase 个字符 trim
用于去除尾随和前导空格的过滤器- 使用
pattern_replace
过滤器去除标点符号。这是因为keyword
分词器不会对文本中的字符做任何事情。standard
分析器会执行此操作,但standard
也会按原样拆分文本
这是您将用于上述映射的查询:
{
"query": {
"match": {
"text": " i am a LITTLE TeaPot short and stout! "
}
}
}