2013-10-25 77 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先前緩存。 –