在ElasticSearch上,根据组

时间:2017-11-09 18:59:06

标签: elasticsearch

我是Elasticsearch的新手,所以如果这个问题很愚蠢我会道歉。

假如我存储书页,我希望每本书能够搜索最相关的一页。

我的第一个想法是在我的索引中有一个Book和Page类型,其中Book将是Page的父级映射。但是如何查询n个最匹配的页面,但是我的结果只限于每本书一页?

现在理论上,如果有某种书允许上述查询从该书中返回多个页面,那该怎么办呢?我认为Book类型中需要一个字段来指示是否允许返回多个页面,但我无法理解如何制定查询以获得该结果。

1 个答案:

答案 0 :(得分:0)

直接的方法是每次查询每本书,并遍历所有书籍。

如果你不知道你有多少书和哪些书,你可以先使用术语聚合来获得所有相关书籍。

通常,最高结果的搜索命中将以毫秒为单位返回。如果你有相关的10,000本书,整个过程可能需要几秒钟。如果您只有几百本书相关(根据亚马逊的搜索体验,这是典型的数量级),可能需要不到1秒,这似乎更容忍。

以下是一种可能的方式。

比如说,如果你有一个索引,它会映射所有书籍的所有页面。每个页面都是此索引中的一个doc(每个数据对象在no-sql样式数据库中被视为'doc',在Elasticsearch的情况下类似)。对于每个doc,应该有一个定义为'the_book_belongs_to'的字段。该字段可以是book_id,指向存储每本书的信息的另一索引。 (书籍和页面不在同一个索引中可能会更好,因为它们具有不同的属性,并且将来,Elasticsearch将不再支持一个索引中的不同_type。)

完成索引编制后,您可以从数千本书中获得数百万页。所有页面都在索引'pages_from_all_books_index'中,所有书籍都在索引'all_books_index'中。

查询正文可能类似于

search_body={
    "query": {
        "bool": {
            "filter": [{"term": {"book_title.keyword": book_title}}]
            }
        },
    "size":n
}

book_title是您可以控制的变量,n是返回文档编号。如果您希望每本书只返回1页,请将n设置为1。

如果您不知道要迭代哪本书,您可以直接从已编入索引的所有书籍中进行迭代,如果整个书籍不是太大,则不会花费太长时间。如果你有很多书,最好先terms aggregations来获得所有相关书籍。