0

我对 ElasticSearch 比较陌生。我将它用作 pdf 文档的搜索平台。我将 PDF 分解为文本页面,并将每一个作为 elasticSearch 记录输入,其中包含相应的页面 ID、父信息等。

我发现困难是将给定查询不仅与 ES 中的单个文档匹配,而且使其与具有相同父 ID 的任何文档匹配。因此,如果搜索了两个术语,如果这些术语存在于实际 PDF 文档的第 1 页和第 7 页(ES 中的 2 个单独条目),我想匹配这个结果。

本质上,我的目标是能够搜索单个 PDF 的多个页面,匹配发生在 PDF 中的任何文档页面上,并为搜索结果返回匹配的 PDF 文档列表,而不是匹配“页面” "

4

2 回答 2

1

您将需要在页面上使用“has_child”查询。我假设您已经定义了文档和页面的父/子关系的映射。然后你可以编写一个“has_child”查询来搜索页面(子类型)但返回 PDF 文档(父类型):

{
  "query": {
    "has_child": {
      "type": "your_pages_type",
      "score_type": "max", // read document for more
      "query": {
        "query_string": {
          "query": "some text to search",
          "fields": [
            "your_pages_body"
          ],
          "default_operator": "and" // "and" if you want to search all words, "or" if you want to search any of words in query
        }
      }
    }
  }
}
于 2013-10-27T09:45:58.193 回答
0

这有点棘手。首先,您必须自己将查询拆分为术语。拥有一个术语列表(比如说和foo,您可以针对表示 PDF 的类型(父类型)创建一个 bool 查询,如下所示:barbaz

{
    "bool" : {
        "must" : [{
            "has_child" : {
                "type": "page",
                "query": {
                    "match": {
                        "page_body": "foo"
                    }
                }
            }
        }, {
            "has_child" : {
                "type": "page",
                "query": {
                    "match": {
                        "page_body": "bar"
                    }
                }
            }
        }, {
            "has_child" : {
                "type": "page",
                "query": {
                    "match": {
                        "page_body": "baz"
                    }
                }
            }
        }]
   }
}

此查询将为您找到每个术语至少包含一页的所有 PDF。

于 2013-10-25T15:27:14.870 回答