2013-07-19 2 views
1

фон:Как определить недостающие документы в ElasticSearch?

В моем индексе ElasticSearch, у меня есть два типа документов, которые могут быть определены как «bvi_ship» и «bvi_notify». Каждый документ, который идентифицируется как «bvi_ship», должен также иметь соответствующий документ, идентифицированный как «bvi_notify».

Вопрос:

Что является подходящим способом идентификации документов «bvi_ship», которые не имеют «bvi_notify» документ?

Использование Facet:

Я был в состоянии определить необходимые документы, используя следующий код: граненый

{ 
    "size":0, 
    "query":{ 
     "filtered":{ 
     "query":{ 
      "query_string":{ 
       "default_operator":"OR", 
       "default_field":"_all", 
       "query":"@fields.action:\"bv_ship\" OR @fields.action:\"bvi_notify\"" 
      } 
     } 
     } 
    }, 
    "facets":{ 
     "terms":{ 
     "terms":{ 
      "field":[ 
       "@fields.object" 
      ], 
      "size":1000 
     } 
     } 
    } 
} 

который возвращает результаты, которые выглядят следующим образом:

{ 
    "took" : 147, 
    ... 
    }, 
    "hits" : { 
    ... 
    }, 
    "facets" : { 
    "terms" : { 
     ... 
     "terms" : [ { 
     "term" : "xml", 
     "count" : 1443 
     }, { 
     "term" : "content_ff47d2d096ea4510ac0895941666e507", 
     "count" : 2 
     }, { 
     "term" : "content_fa525becb2724b7682df278c02fed308", 
     "count" : 2 
     }, 
     ... THOUSANDS OF RECORDS WITH COUNT of 2 
     }, { 
     "term" : "content_f1ff2f7440534a08bad4c62b92165949", 
     "count" : 1 
     } ] 
    } 
    } 
} 

Это может работать хорошо, но я, очевидно, не хочу возвращать t которые имеют счет 2, когда меня действительно интересуют только записи, которые имеют счет 1.

Есть ли способ ограничить грань поиска, чтобы он возвращал только записи со счетом 1 ?

Использование фильтра:

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

ответ

0

Я думаю, что лучший способ сделать это - индексировать записи объектами 'bvi_notify' как дочерние записи с объектами 'bvi_ship'. Затем вы сможете использовать фильтр has_child в редакторе must_not фильтра bool, чтобы найти все документы «bvi_ship», которые не имеют соответствующих объектов «bvi_notify».

Чтобы ответить на ваш первоначальный вопрос, невозможно ограничить термины граней только терминами с числом 1, но вы можете сортировать грани с помощью порядка reverse_count, который приведет все термины с количеством 1 в начало список. Тем не менее, я должен также упомянуть, что если у вас более 1 осколка, подсчеты, которые вы получаете в своих грани might be incorrect. Это еще одна причина, по которой я бы рекомендовал использовать родительское/дочернее решение вместо граней.

+0

Я думал о взаимоотношениях между родителями и детьми, к сожалению, я не имею прямого контроля над тем, как документы индексируются, кроме предоставления основных параметров. Благодарим за идею обратного_сочетания, а также о том, почему они могут быть неверными. –

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