查询匹配模式分词器
Query match pattern tokeniser
假设我们有一个搜索查询 Vacuum cleaner WSP 6666 C 22 C 2 KW rubber,我们希望将其与我们的索引进行匹配。的索引产品是:
...
"categories": [
"Vacuum cleaner",
"Blender",
],
"modelnumbers": [
"WSP 6666 C 22 C 2 KW",
"ABST 23",
"2h28f7h2i3f",
]
现在我想匹配两个类别作为型号
{
"query": {
"function_score": {
"query": {
"bool": {
"should": [
{
"query_string": {
"query": "Vacuum cleaner WSP 6666 C 22 C 2 KW rubber",
"default_operator": "OR",
"default_field": "categories",
"boost": "10"
}
},
{
"query_string": {
"query": "Vacuum cleaner WSP 6666 C 22 C 2 KW rubber",
"default_operator": "OR",
"default_field": "modelnumbers",
"boost": "10"
}
}
}
}
}
这显示了正确的结果。但是现在它匹配以下所有内容:
- 真空
- 清洁工
- WSP
- 666666
- C
- 22
- C
- 2
- 千瓦
是否有一种使用分词器的方法可以只找到匹配项?:
- 吸尘器
- WSP 6666 C 22 C 2 千瓦
如您所见,并非所有正则表达式都具有相同的格式,因此不可能使用正则表达式标记器。
处理此问题的正确方法是使用 (edge-)ngrams 对数据进行索引。但在执行此操作之前,您可能想尝试使用与您关心的字段匹配的 multi_match
查询:
{
"query": {
"multi_match": {
"query": "Vacuum cleaner WSP 6666 C 22 C 2 KW rubber",
"fields": [
"categories",
"modelnumbers"
]
}
}
}
遵循 Val 的建议,并查看 cross_fields 多匹配查询。您稍后可以使用 DisMax 或 Bool 查询改进您的查询(DisMax 查询实际上是一个 bool 查询)。
假设我们有一个搜索查询 Vacuum cleaner WSP 6666 C 22 C 2 KW rubber,我们希望将其与我们的索引进行匹配。的索引产品是:
...
"categories": [
"Vacuum cleaner",
"Blender",
],
"modelnumbers": [
"WSP 6666 C 22 C 2 KW",
"ABST 23",
"2h28f7h2i3f",
]
现在我想匹配两个类别作为型号
{
"query": {
"function_score": {
"query": {
"bool": {
"should": [
{
"query_string": {
"query": "Vacuum cleaner WSP 6666 C 22 C 2 KW rubber",
"default_operator": "OR",
"default_field": "categories",
"boost": "10"
}
},
{
"query_string": {
"query": "Vacuum cleaner WSP 6666 C 22 C 2 KW rubber",
"default_operator": "OR",
"default_field": "modelnumbers",
"boost": "10"
}
}
}
}
}
这显示了正确的结果。但是现在它匹配以下所有内容:
- 真空
- 清洁工
- WSP
- 666666
- C
- 22
- C
- 2
- 千瓦
是否有一种使用分词器的方法可以只找到匹配项?:
- 吸尘器
- WSP 6666 C 22 C 2 千瓦
如您所见,并非所有正则表达式都具有相同的格式,因此不可能使用正则表达式标记器。
处理此问题的正确方法是使用 (edge-)ngrams 对数据进行索引。但在执行此操作之前,您可能想尝试使用与您关心的字段匹配的 multi_match
查询:
{
"query": {
"multi_match": {
"query": "Vacuum cleaner WSP 6666 C 22 C 2 KW rubber",
"fields": [
"categories",
"modelnumbers"
]
}
}
}
遵循 Val 的建议,并查看 cross_fields 多匹配查询。您稍后可以使用 DisMax 或 Bool 查询改进您的查询(DisMax 查询实际上是一个 bool 查询)。