2013-10-25 3 views
0

Я относительно новичок в ElasticSearch. Я использую его как платформу поиска для документов PDF. Я разбиваю PDF-файлы на текстовые страницы и вводим их как запись с эластичным поиском с соответствующим идентификатором страницы, информацией о родителях и т. Д.Совместимость с несколькими документами с ElasticSearch

То, что мне трудно найти, соответствует заданному запросу не только к одному документу в ES , но при этом он соответствует любому документу с одним и тем же идентификатором родителя. Поэтому, если поиск двух терминов, если термины существуют на страницах 1 и 7 фактического документа PDF (2 отдельных входа в ES), я хочу сопоставить этот результат.

По существу моя цель состоит в том, чтобы иметь возможность выполнять поиск по нескольким страницам одного PDF-файла, сопоставляя их на любой странице документа в PDF-документе и возвращать список соответствующих документов PDF для результата поиска, вместо этого соответствующих «страниц»

+0

Большое спасибо за ответы. Я хотел уточнить требования. Duc.duong предложил использовать has_child, это кажется наиболее логичным. Я хотел добавить, что мне нужна возможность определить (возможно, через вторичный запрос) страницы, на которых совпадали совпадения. – lwdjustin

ответ

0

Это несколько сложно. Прежде всего, вам придется разделить свой запрос на себя. Имея список терминов (скажем foo, bar и baz, вы можете создать булев запрос к 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

Спасибо за ваше предложение, это очень полезно. Одной функциональностью, которую мне нужно сохранить, является способность идентифицировать, на какой странице было сопоставлено данное слово. Учитывая, что если я использую сопоставление parent/child, он вернет родительский документ, есть ли способ получить набор сопоставленных страниц (в этом случае будут дети, ака: совпадение слов)? – lwdjustin

+0

Боюсь, что вам нужно выполнить второй запрос, чтобы получить сопоставленные страницы. Я столкнулся с этой проблемой, и вот что я решил: 1. сделайте запрос has_child, например, мой ответ, чтобы найти PDF-документ, 2. делайте обычный запрос с тем же условием, что и has_child, чтобы находить страницы, но ограничиваться родителями, которые соответствуют (1) (запрос + фильтр). (2) запрос выполняется очень быстро, потому что поиск ограничен в заданных родительских целях и может быть кеширован ранее ES. –

Смежные вопросы