2015-06-18 2 views
0

Есть ли способ в Elasticsearch через фильтры, запросы, агрегации и т. Д. Искать список идентификаторов документов и возвращать, какие идентификаторы не попали?elasticsearch запрос, чтобы найти документы, которые не существуют

С небольшим списком достаточно легко сравнить результаты с запрошенным списком идентификаторов, но я имею дело со списками идентификаторов в десятках тысяч, и это не будет выполнено для этого.

+0

Какой интерфейс/язык вы используете? Может помочь ответить на ваш вопрос? – Danielson

+0

Использование REST API – Jennifer

+0

Непосредственно? Или с помощью Java, PHP, Perl? Этот комментарий был в основном для более конкретного кода (будь то в том, что я использую) – Danielson

ответ

0

ли вы имеете в виду, от https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-not-filter.html

"filtered" : { 
    "query" : { 
     "term" : { "name.first" : "shay" } 
    }, 
    "filter" : { 
     "not" : { 
      "range" : { 
       "postDate" : { 
        "from" : "2010-03-01", 
        "to" : "2010-04-01" 
       } 
      } 
     } 
    } 
} 

Посмотрите на руководство по https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html

+0

Я не думаю, что использование фильтра не будет работать, поскольку он отфильтровывает сопоставленные документы. В случае, если я смотрю, нет совпадающих документов. Чтобы уточнить, возьмите указатель с документами 1,2,3,4,5,6,7. Пользователь выполняет поиск и получает 1,4,7 в результате. Пользователь, чем сохраняет этот список и возвращается на следующий день после того, как другой пользователь удалил doc с идентификатором 4. Пользователь 1 теперь выполняет поиск идентификаторов документов с идентификаторами 1,4 или 7 и возвращает только 2 обращения. Мне нужен запрос, который скажет им, что 4 не ударил документ. Хотя в этом примере тривиально, это не так тривиально, когда мы имеем дело с списком идентификаторов тысяч. – Jennifer

+0

Хорошо, эта часть была неясной (для меня). Тогда я бы предложил использовать поиск на каждом _uid и делать то, что вы предлагали. Я думаю, что BulkRequest вместо поиска, потому что он вернет запрошенные запросы в том же порядке, что и запрос. Если, однако, количество документов слишком велико, используйте SearchScroll (например, я предложил http://stackoverflow.com/questions/30918412/elasticsearch-multiple-scrolls-java-api). Я использую это для миллионов предметов. (будь то резервный план) – Danielson

+0

Может быть, скрипт Groovy может помочь https://www.elastic.co/blog/running-groovy-scripts-without-dynamic-scripting. Я не уверен, как это работает, но я думаю, что вы можете отправить его как PostFilter/script. Поэтому инвертируйте фильтр, полученные из результата – Danielson

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