2016-12-14 2 views
1

У меня есть данные этого формата в elasticsearch, каждый из которых находится в отдельном документе:ElasticSearch запроса с условиями на нескольких документах

{ «PID»: 1, «нм»: «Том»}, { «PID» : 1, 'nm': 'dick' '}, {' pid ': 1,' nm ':' harry '}, {' pid ': 2,' nm ':' tom '}, {' pid ': 2, 'nm': 'harry'}, {'pid': 3, 'nm': 'dick'}, {'pid': 3, 'nm': 'harry'}, {'pid': 4, «нм»: «гарри»}

{ 
     "took": 137, 
     "timed_out": false, 
     "_shards": { 
      "total": 5, 
      "successful": 5, 
      "failed": 0 
     }, 
     "hits": { 
      "total": 8, 
      "max_score": null, 
      "hits": [ 
      { 
       "_index": "query_test", 
       "_type": "user", 
       "_id": "AVj9KS86AaDUbQTYUmwY", 
       "_score": null, 
       "_source": { 
        "pid": 1, 
        "nm": "Harry" 
       } 
      }, 
      { 
       "_index": "query_test", 
       "_type": "user", 
       "_id": "AVj9KJ9BAaDUbQTYUmwW", 
       "_score": null, 
       "_source": { 
        "pid": 1, 
        "nm": "Tom" 
       } 
      }, 
      { 
       "_index": "query_test", 
       "_type": "user", 
       "_id": "AVj9KRlbAaDUbQTYUmwX", 
       "_score": null, 
       "_source": { 
        "pid": 1, 
        "nm": "Dick" 
       } 
      }, 
      { 
       "_index": "query_test", 
       "_type": "user", 
       "_id": "AVj9KYnKAaDUbQTYUmwa", 
       "_score": null, 
       "_source": { 
        "pid": 2, 
        "nm": "Harry" 
       } 
      }, 
      { 
       "_index": "query_test", 
       "_type": "user", 
       "_id": "AVj9KXL5AaDUbQTYUmwZ", 
       "_score": null, 
       "_source": { 
        "pid": 2, 
        "nm": "Tom" 
       } 
      }, 
      { 
       "_index": "query_test", 
       "_type": "user", 
       "_id": "AVj9KbcpAaDUbQTYUmwb", 
       "_score": null, 
       "_source": { 
        "pid": 3, 
        "nm": "Dick" 
       } 
      }, 
      { 
       "_index": "query_test", 
       "_type": "user", 
       "_id": "AVj9Kdy5AaDUbQTYUmwc", 
       "_score": null, 
       "_source": { 
        "pid": 3, 
        "nm": "Harry" 
       } 
      }, 
      { 
       "_index": "query_test", 
       "_type": "user", 
       "_id": "AVj9KetLAaDUbQTYUmwd", 
       "_score": null, 
       "_source": { 
        "pid": 4, 
        "nm": "Harry" 
       } 
      } 
      ] 
     } 
    } 

и мне нужно найти PID, который есть «гарри» и не имеют «Томь», который в приведенном выше примере 3 и 4. Какие essentialy средства поиска документы, имеющие одинаковые pids, где ни один из них не имеет nm со значением ' tom ', но по крайней мере один из них имеет nm со значением «harry».

Как это сделать?

EDIT: Использование Elasticsearch версия 5

ответ

1

Что делать, если у вас есть POST тело запроса, который может выглядеть, как показано ниже, где вы могли бы использовать bool:

POST _search 
{ 
    "query": { 
    "bool" : { 
     "must" : { 
     "term" : { "nm" : "harry" } 
     }, 
     "must_not" : { 
     "term" : { "nm" : "tom" } 
     } 
    } 
    } 
} 
+0

Не опасно ли использовать терминологический запрос в анализируемом поле? нм будет проанализирован в этом случае, если отображение отсутствует. – Artholl

+0

@Artholl Что делать, если вы используете 'not_analyzed', если вы не хотите, чтобы это поле было проанализировано для вышеуказанного сценария? – Kulasangar

+0

@ Kulasangar не будет ли этот запрос применять условия соответствия/фильтра в том же документе? Но здесь, например, три документа имеют одинаковый pid, т. Е. 1, но три разных значения для «nm». – harbinger

0

Я относительно очень новый в Elasticsearch, поэтому я могу ошибаться. Но такого запроса я никогда не видел. Простые фильтры не могут использоваться здесь, поскольку они применяются к документу (а не к агрегатам), который вам не нужен. Я вижу, что вы хотите выполнить запрос «Группировать по» с предложением «Имея» (с точки зрения SQL). Но Group by queries включает некоторую агрегацию (например, avg, max, min любого поля), которая используется в предложении «Have». В основном вы используете редуктор для пост-обработки результатов агрегирования. Для таких запросов Может использоваться агрегация селектора ковша. Прочитано this
Но ваш случай отличается. Вы не хотите применять предложение «Включение» в любом агрегировании показателей, но вы хотите проверить, присутствует ли какое-либо значение в поле (или столбце) ваших данных «по группам». Что касается SQL, вы хотите сделать запрос «где» в «group by». Это то, чего я никогда не видел. Вы также можете прочитать this
Однако на уровне приложений вы можете легко сделать это, разбив ваш запрос. Сначала найдите уникальный pid, где nm = harry, используя термин aggs. Затем получите документы для этих pid с дополнительным условием nm! = Tom.

P.S. Я очень знаком с ES. И я буду очень рад, если кто-то противоречит мне, покажет способы сделать это в одном запросе. Я также узнаю об этом.

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