这里是关于术语的弹性搜索官方网站: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"
中提及即可。
您主要需要了解的是,查找值都是从单个文档的字段中提取的,而不是从多个文档中提取的。