可以通过其他字段查找机制查询机制但是ID?

时间:2016-01-05 03:55:39

标签: elasticsearch

这里是elasticsearch官方网站关于术语: 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"
      }
    }
  }
}'

但是,如果我想通过其他用户领域进行查询,该怎么办? 假设用户有一些其他字段,如名称,我可以使用术语查找机制通过给用户名而不是id来查找推文。 我试过使用这样的命令:

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

但它发生错误。 期待您的帮助。谢谢!

2 个答案:

答案 0 :(得分:4)

术语查找机制基本上是一个内置的优化,不必对JOIN两个索引进行两次查询,即索引A中的一个用于获取查找的ID,第二个用索引B中的那些ID获取文档。

与SQL相反,这样的JOIN只能在id字段上工作,因为这是通过GET调用从Elasticsearch唯一检索文档的唯一方法,这正是Elasticsearch将在{ {1}}查询。

因此,要回答您的问题,术语查找机制将无法在terms字段以外的任何其他字段上运行,因为要检索的第一个文档必须是唯一的。在您的情况下,ES不知道如何使用id name为用户提取文档,因为Jane只是用户文档中的字段,但绝不是唯一标识符对于用户name

答案 1 :(得分:3)

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

如果您想阅读其他任何字段,请在"path"

中提及

您最需要了解的是,查找值全部来自单个文档的字段,而不是多个文档。