2016-02-01 4 views
1

Я пытаюсь отфильтровать мой запрос на 2 поля, но продолжаю получать ошибку. Я использую и запрос как предложено Elasticsearch документы (это на самом деле 'BOOL' запрос), здесь- https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-post-filter.htmlИ запрос в Elasticsearch

GET /index_v1/user/_search 
{ 
    "query": { 
    "bool": { 
     "filter": { 
     { "term": { "id": "101" }}, 
     { "term": { "firstName": "John" }} 
     } 
    } 
    } 
} 

Это работы-

GET /index_v1/user/_search 
{ 
    "query": { 
    "filtered": { 
     "query": { 
      "match": { 
       "id": "101"    
      } 
     } 
    } 
    } 
} 

и возвращает this-

{ 
    "took": 24, 
    "timed_out": false, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 2, 
     "max_score": 3.442347, 
     "hits": [ 
     { 
      "_index": "index_v1", 
      "_type": "user", 
      "_id": "1", 
      "_score": 3.442347, 
      "_source": { 
       "id": "101", 
       "firstName": "John", 
       "guid": "1001", 
       "lastName": "Doe", 
       "email": "[email protected]", 
       "entitlements": { 
        "id": "en2" 
       } 
      } 
     }, 
     { 
      "_index": "index_v1", 
      "_type": "user", 
      "_id": "2", 
      "_score": 3.140066, 
      "_source": { 
       "id": "101", 
       "firstName": "John", 
       "guid": "1001", 
       "lastName": "Doe", 
       "email": "[email protected]", 
       "tenants": [ 
        { 
        "id": "12345", 
        "roles": [ 
         "PrimaryAdmin" 
        ] 
        } 
       ], 
       "entitlements": { 
        "id": "en2" 
       } 
      } 
     } 
     ] 
    } 
} 

Вот отображение document-

{ 
    "index_v1": { 
     "mappings": { 
     "user": { 
      "properties": { 
       "email": { 
        "type": "string" 
       }, 
       "entitlements": { 
        "properties": { 
        "id": { 
         "type": "string" 
        } 
        } 
       }, 
       "firstName": { 
        "type": "string" 
       }, 
       "guid": { 
        "type": "string" 
       }, 
       "id": { 
        "type": "string" 
       }, 
       "lastName": { 
        "type": "string" 
       }, 
       "tenants": { 
        "properties": { 
        "id": { 
         "type": "string" 
        }, 
        "roles": { 
         "type": "string" 
        } 
        } 
       } 
      } 
     } 
     } 
    } 
} 

Кроме того, как я могу добавить это и условие

["tenants"]["id"]="12345" 
+0

пожалуйста, напишите отображения вашего индекса – ChintanShah25

+0

Просто отправил его. – Maryam

ответ

1

Вы должны выполнить отфильтрованный запрос использовать фильтры. Соответствующий пример, который вам нужен, - here.

GET /index_v1/user/_search 
{ 
    "query": { 
    "filtered": { 
     "query": { 
     "match_all": {} 
     }, 
     "filter": { 
     "and": [ 
      { "term": { "id": "101" }}, 
      { "term": { "firstName": "John" }}, 
      { "term": { "tenants.id": "12345" }} 
     ] 
     } 
    } 
    } 
} 

Это должно быть примерно это, хотя я уверен, что вы должны настроить его (я немного ржавый).

Для того, чтобы поля id точно совпадали, вы должны установить, что эти поля будут анализироваться как ключевые слова в сопоставлении, иначе ES попытается с ним справиться и дать неожиданные результаты.

+0

Спасибо, Ник, это звучит многообещающе, но я получил то же самое: «SearchPhaseExecutionException: SearchParseException» – Maryam

+0

@Maryam Я обновил сообщение, чтобы включить ссылку на соответствующий пример в документах ES. Если бы вы могли, пожалуйста, разместите полный дамп ошибок, который вы вернетесь, и это поможет нам быстро это прояснить. –

+2

есть запятая отсутствует после запроса. – Richa

0

Запрос отправленный Ник Ларсон должен работать хорошо, но насколько именно то, что случилось с вашим запросом, вы используете фигурные скобки, где вы должны использовать квадратных скобки (на самом деле это недопустимый синтаксис JSON, в это текущая форма). "filter" должен быть массивом, поэтому вы должны использовать квадратные скобки:

GET /index_v1/user/_search 
{ 
    "query": { 
    "bool": { 
     "filter": [ 
     { "term": { "id": "101" }}, 
     { "term": { "firstName": "John" }} 
     ] 
    } 
    } 
} 
Смежные вопросы