这里是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"
}
}
}
}'
但它发生错误。 期待您的帮助。谢谢!
答案 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"
。
您最需要了解的是,查找值全部来自单个文档的字段,而不是多个文档。