【发布时间】:2020-06-19 18:03:42
【问题描述】:
我有一个文档索引,每个文档都包含一个 id 和 name 字段。每个文档name 恰好是唯一的。
我想对name 字段执行查询,如果可能返回一个确切的结果,或者返回一个类似结果的列表。例如,如果搜索词是 Acme Incorporated 并且有准确的结果,则仅返回该结果。否则返回相似匹配;例如:ACME Inc.、acme、Ace 等
我假设我需要以某种方式组合基于关键字的术语查询以进行精确匹配,并以基于文本的匹配查询进行类似匹配。我仍在处理复合查询,所以我的第一次尝试非常天真:
{
"query": {
"bool": {
"should": [
{
"term": {
"name.exact": "Acme Incorporated"
}
},
{
"match": {
"name": "Acme Incorporated"
}
}
]
}
}
}
这将返回一个相似匹配列表和一个精确匹配(如果存在),因为至少有一个查询应该成功。这显然是不正确的。
为了方便上面基于关键字的词条查询,我在我的文档映射中添加了name.exact:
{
"mappings": {
"properties": {
"id": {
"type": "integer"
},
"name": {
"type": "text",
"fields": {
"exact": {
"type": "keyword"
}
}
}
}
}
}
我想另一种方法是使用Multi Search API 分别执行上述查询。这使我可以查看响应,并在术语查询结果集为空时决定使用匹配查询。这适用于我的用例,但我怀疑这不是最佳方法。
我认为这是一个常见的用例,但我不确定解决方案是什么。
编辑
我目前对此的想法是我使用如上所述的多搜索查询,第一个是基于相同关键字的术语查询以尝试找到确切的结果,第二个是以下 - 复合 bool排除精确结果的查询。
{
"query": {
"bool": {
"must": {
"match": {
"name": "Acme Incorporated"
}
},
"must_not": {
"term": {
"name.keyword": "Acme Incorporated"
}
}
}
}
}
【问题讨论】:
标签: elasticsearch