【问题标题】:ElasticSearch retrieve only list elements that match a term within single documentElasticSearch 仅检索与单个文档中的术语匹配的列表元素
【发布时间】:2020-07-05 12:53:25
【问题描述】:

鉴于此文档结构。

{
   "title":"Lord of the rings",
   "id":"123abc",
   "pages":[
      {
         "pageNumber":1,
         "content":"Lorem ipsum lorem ipsum lorem ipsum"
      },
      {
         "pageNumber":2,
         "content":"dolor sit dolor sit dolor sit"
      }
   ]
}

还有这个查询

{
   "query":{
      "match":{
         "pages.content":"lorem"
      }
   }
}

有没有办法弹性可以给我这样的结果:

{
   "title":"Lord of the rings",
   "id":"123abc",
   "pages":[
      {
         "pageNumber":1,
         "content":"Lorem ipsum lorem ipsum lorem ipsum"
      }
   ]
}

所以如果我有数百页,我只会得到与我的术语相匹配的那些?

虽然我想为页面创建索引,但是如何从文档中获取所有元数据?可以说,是否应该将此元数据复制到同一“书”的所有页面文档中? 就性能而言,最佳方法是什么?

【问题讨论】:

    标签: elasticsearch elasticsearch-query term-query


    【解决方案1】:

    是的,共享一些通用元数据的文档在 NoSQL 数据存储中是很正常的(而且经常是必要的)。至于另一种方法,您可以使用highlighting 甚至一些painless scripting,但我会推荐以下内容:

    POST pages/_doc
    {
      "book": {
        "title": "Lord of the rings",
        "id": "123abc",
        "metadata": {
          "num_of_pages": 300
        }
      },
      "page": {
        "pageNumber": 1,
        "content": "Lorem ipsum lorem ipsum lorem ipsum"
      }
    }
    
    POST pages/_doc
    {
      "book": {
        "title": "Lord of the rings",
        "id": "123abc",
        "metadata": {
          "num_of_pages": 300
        }
      },
      "page": {
        "pageNumber": 2,
        "content": "dolor sit dolor sit dolor sit"
      }
    }
    

    然后

    GET pages/_search
    {
      "query": {
        "match": {
          "page.content": "lorem"
        }
      }
    }
    

    这要简单得多,并且可以很好地扩展。

    【讨论】:

    • 这也让我想到一个问题。弹性搜索创建匹配查询分数的方式(tf+idf)。考虑下一种情况 Book A = 100 pages Book B = 100 pages 搜索查询:“lorem” Book A 有一个页面,其中该术语出现 10 次。所以99页没有学期,1页10次这个学期。书 B 有大约 20 页,其中该术语在单页中最多出现 6 次。 Elastic 会给我书 A 的页面作为最高分,但书 B 将更适合搜索,因为它总体上具有更高的频率。如何管理?
    • 我想它会,但你对页面而不是书籍感兴趣,不是吗?我就是这样理解你的询问的。或者您是否在整本书中寻找词频?这是一个完全不同的用例。
    • 可以说我有两个用例,有时我需要知道什么书,然后有时我需要知道一本书的哪一页。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    相关资源
    最近更新 更多