2013-10-25 76 views
0

我对ElasticSearch比较新。我正在使用它作为pdf文档的搜索平台。我把PDF分成文本页面,并将其作为一个elasticSearch记录,并输入相应的页面ID,父级信息等。使用ElasticSearch匹配多个文档

我发现很难将给定的查询不仅与ES中的单个文档进行匹配,但要使它与具有相同父代ID的任何文档匹配。因此,如果搜索了两个词语,如果实际PDF文档的第1页和第7页中存在这些词语(2个单独的词条进入ES),我想匹配这个结果。

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

+0

非常感谢迄今为止的答案。我想澄清要求。 Duc.duong建议使用has_child,这似乎是最合乎逻辑的。我想补充一点,我需要能够确定(也许通过辅助查询)匹配发生的页面。 – lwdjustin

回答

0

这有点棘手。首先,您必须自己将查询分解为条件。其术语列表(比方说foobarbaz,您可以创建针对类型代表PDF的一个布尔查询(父类),这将是这样的:

{ 
    "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文件每个学期至少有一个页面

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 
     } 
     } 
    } 
    } 
} 
+0

感谢您的建议,这非常有帮助。我需要保留的一个功能是能够识别给定单词匹配的页面。 鉴于如果我使用父/子映射,它将返回父文档,是否仍然有办法检索匹配页面的集合(儿童,又名:在这种情况下是词匹配)? – lwdjustin

+0

恐怕你必须做第二次查询来获得匹配的页面。我遇到了这个问题,我解决了这个问题:1.做一个像查找PDF文档的答案一样的has_child查询,2.以与has_child相同的条件查找页面,但仅限于匹配的父母(1)(查询+过滤器)。 (2)查询运行速度非常快,因为搜索仅限于指定的父范围,并且可能由ES先前缓存。 –