弹性搜索中的优先字段或查询

Prioretized field OR query in elasticsearch

我想知道我的问题的解决方案:

假设我的 Elasticsearch 文档中有一个 artistId 和 songId。

我想查询这样的文档:

如果可能的话,用词条查询用songId查询,但是如果没有匹配给定songId的结果,我想用artistId查询。我想在这里做的逻辑是优先查询 songId。这个分数应该高于 artistId。匹配相同的songId!如果我的查询结果中没有相同的songId,我可以用artistId重新查询。但我无法在没有 2 个查询的情况下找到解决方案。

我想只用一个查询来应用它,用 elasticsearch 查询可以吗?

我找到了多重匹配查询:

{
  "multi_match" : {
    "query":    "songId12345", 
    "fields": [ "songId^3", "artistId" ] 
  }
}

通过此查询,我的 songId 被优先考虑,但我无法为我的查询提供相同的 bot songId 值和 artistId 值:songId12345 我的 artistId 值必须不同于 songId。也许我可以用

之类的新字段保留值

mixedField: songId - artistId

但它也不应该完全起作用。

总结:找到我相同的 songId,如果我的查询有 return 任何值,找到我有相同的 artistId 并且只用 1 个查询

有什么想法吗?谢谢你的时间。

此处的一种方法是使用 boolean 查询并使用 should 子句组合您的查询。

此外,您需要 boost songId 子句。 查询将是这样的:

{
   "query": {
      "bool": {
         "should": [
            {
               "match": {
                  "songId": {
                     "query": "song123",
                     "boost": 2
                  }
               }
            },
            {
               "match": {
                  "artistId": {
                     "query": "artist123"
                  }
               }
            }
         ]
      }
   }
}

阅读全文here