作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于 ElasticSearch 查询,我们希望以不同方式处理单词(即仅由字母组成的标记)和非单词。为此,我们尝试定义两个分析器,要么返回单词,要么返回非单词。
例如,我们有描述五金店产品的文档:
{
"name": "Torx drive T9",
"category": "screws",
"size": 2.5,
}
然后用户将搜索“Torx T9”并希望找到该文档。搜索 T9 过于笼统,会提供太多不相关的产品。因此,如果我们已经找到“Torx”,我们只想搜索“T9”一词。
我们尝试创建这样的查询
{
"query": {
"bool": {
"must": {
"match: {
"name": {
"query": "Torx T9",
"analyzer": "words"
}
},
"should": {
"match: {
"name": {
"query": "Torx T9",
"analyzer": "nonwords"
}
}
}
}
}
想法是创建 token 过滤器来执行此操作很简单。例如:
"settings": {
"analysis": {
"filter": {
"words": {
"type": "pattern",
"pattern": "\\A\\p{L}*\\Z",
},
"nonwords": {
"type": "pattern",
"pattern": "\\P{L}",
}
}
}
但是似乎没有一个过滤器只是匹配模式。相反,我们(ab)使用 pattern_replace 过滤器:
"settings": {
"analysis": {
"filter": {
"words": {
"type": "pattern_replace",
"pattern": "\\A((?=.*\\P{L}).*)",
"replacement": ""
},
"nonwords": {
"type": "pattern_replace",
"pattern": "\\A((?!.*\\P{L}).*)",
"replacement": ""
},
"nonempty": {
"type": "length",
"min":1
}
}
}
这会将不需要的标记替换为空标记,然后可以通过非空过滤器将其删除。这似乎可行,但所需的模式更加模糊。
有更好的表达方式吗?
最佳答案
你可以试试query-string-query将 default_operator 作为“AND”以满足您的要求。
例如,假设您正在索引两个字符串“Torx drive T9”和“Square drive T9”。如果您使用 whitespace tokenizer为了索引,字符串将被分析为以下标记
第一个文档:torx
、drive
和 t9
。
第二个文档:square
、drive
和t9
。
然后使用查询字符串查询来匹配具有默认运算符的文档,如 AND 将产生预期的结果。
示例映射
{
"settings": {
"analysis": {
"analyzer": {
"whitespace": {
"type": "pattern",
"pattern": "\\s+"
}
}
}
},
"mappings": {
"my_type": {
"properties": {
"name": {
"type": "string",
"analyzer": "whitespace"
}
}
}
}
}
示例查询
{
"query": {
"query_string": {
"default_field": "name",
"query": "Torx T9",
"default_operator": "AND"
}
}
}
只有当 torx
和 t9
都出现在文档中时,此查询才会产生结果。
关于elasticsearch - 如何在 ElasticSearch 中基于正则表达式过滤标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35742426/
我是一名优秀的程序员,十分优秀!