can术语查找机制可以通过id以外的其他字段进行查询



这里是关于术语的弹性搜索官方网站:https://www.elastic.co/guide/en/elasticsearch/reference/2.1/query-dsl-terms-query.html

正如我们所看到的,如果我们想进行术语查找机制查询,我们应该使用这样的命令:

curl -XGET localhost:9200/tweets/_search -d '{
  "query" : {
    "terms" : {
      "user" : {
        "index" : "users",
        "type" : "user",
        "id" : "2",
        "path" : "followers"
      }
    }
  }
}'

但如果我想通过其他领域的用户进行查询呢。假设用户有一些其他字段,比如name,我可以使用术语查找机制,通过给用户提供name而不是id来查找tweet吗。我试着使用这样的命令:

curl -XGET localhost:9200/tweets/_search -d '{
  "query" : {
    "terms" : {
      "user" : {
        "index" : "users",
        "type" : "user",
        "name" : "Jane",
        "path" : "followers"
      }
    }
  }
}'  

但是它发生了错误。期待您的帮助。非常感谢。

术语查找机制基本上是一种内置的优化,不必进行两次查询来联接两个索引,即一次在索引a中获取要查找的ID,另一次获取索引B中具有这些ID的文档。

与SQL相反,这样的JOIN只能在id字段上工作,因为这是通过GET调用从Elasticsearch唯一检索文档的唯一方法,而这正是Elasticsearch在terms查找中所做的。

因此,为了回答您的问题,术语查找机制将不适用于除id字段之外的任何其他字段,因为要检索的第一个文档必须是唯一的。在您的情况下,ES不知道如何为具有name Jane的用户获取文档,因为name只是用户文档中的一个字段,但决不是用户Jane的唯一标识符。

我想您并不完全理解这是如何工作的。术语查找查询的工作原理是从具有给定id的文档的字段中读取值。在这种情况下,您试图将tweets索引中字段user的值与users索引和user类型中id为"2"的文档中字段followers的值相匹配。

如果你想阅读任何其他字段,那么只需在"path"中提及即可。

您主要需要了解的是,查找值都是从单个文档的字段中提取的,而不是从多个文档中提取的。

最新更新