根据字词查询找到一个结果,或者根据匹配查询找到一个结果列表

时间:2020-06-17 16:39:19

标签: elasticsearch

我有一个文档索引,每个文档包含一个idname字段。每个文档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分别执行上述查询。这使我可以查看响应,并在条件查询结果集为空时决定使用匹配查询。这将适用于我的用例,但我怀疑这不是最佳方法。

我认为这是一个常见的用例,但是我不确定解决方案是什么。

修改

我目前的想法是,如上所述,我进行了多次搜索查询,第一个是基于关键词的术语查询,试图找到确切的结果,第二个是以下查询–复合{{1 }}排除精确结果的查询。

bool

1 个答案:

答案 0 :(得分:0)

最后,MultiSearch API适合我的用例:

多重搜索API从单个API请求中执行多个搜索。请求的格式类似于批量API格式,并使用换行符分隔的JSON(NDJSON)格式。

我用它在一个请求中执行两个查询:

  1. 在文档term字段中使用基于关键字的name查询来查找所有精确结果。
  2. 使用bool查询来查找任何类似的结果,其中包括对 文档match字段和第一个查询的name 过滤掉所有确切结果。

Multi Search主体由一对或多对(可选)空标头和主体(单个查询)组成,并以换行符分隔;例如:

must_not

查询采用ndjson格式,其中指出“每行都是有效的JSON值”。这就要求将每个查询压缩到一行,这不是很可读,但是如果您使用库来构造查询,这不是问题。

相关问题