2016-04-14 3 views
1

У меня есть следующие отображения:термин фильтр Elasticsearch с несколькими значениями

PUT /files 
{ 
    "mappings": { 
     "file": { 
     "properties": { 
      "FileID": { 
       "type": "integer" 
      }, 
      "FolderID": { 
       "type": "integer" 
      } 
     } 
     } 
    } 
} 

Мои данные:

PUT /clients/client/1 
{ 
    "id":"1", 
    "name":"Joe Doe", 
    "FolderIDs":["577173","245340","777035"], 
    "Emails" : ["[email protected]", "[email protected]"] 
} 



PUT /files/file/1 
{ 
    "FileID": "10550", 
    "FolderID" : "577173" 
} 

Мой запрос:

GET /_search 
{ 
    "query": { 
     "filtered": { 
     "query": { 
      "match_all": {} 
     }, 
     "filter": { 
      "terms": { 
       "FolderID": { 
        "index": "clients", 
        "type": "client", 
        "id": "1", 
        "path": "FolderIDs" 
       } 
      } 
     } 
     } 
    } 
} 

Это возвращает файл с идентификатором 10550, отлично. Мой вопрос заключается в том, как это сделать в поле электронной почты со списком электронных писем, например.

отображение:

PUT /emails 
{ 
    "mappings": { 
     "email": { 
     "properties": { 
      "EmailID": { 
       "type": "integer" 
      }, 
      "ADDRESS_FROM": { 
       "type": "string", 
       "index" : "not_analyzed" 
      } 
     } 
    } 
} 

данные:

PUT /emails/email/1 
{ 
    "EmailID": "8335", 
    "ADDRESS_FROM" : "[email protected] [email protected]" 
} 

Как создать запрос, который возвращает электронные письма, которые не имеют какой-либо из писем в ADDRESS_FROM из области клиентских сообщений электронной почты?

т.е.

клиент 1 имеет [ "[email protected]", "[email protected]"] так вернуть электронную почту 1, потому что ADDRESS_FROM не содержит клиент 1 сообщения электронной почты ("случайную @ электронную почту. com [email protected] ").

Я пытался что-то похожее на это (не работает):

GET /_search 
{ 
    "query": { 
     "filtered": { 
     "query": { 
      "match_all": {} 
     }, 
    "filter": { 
     "bool": { 
     "must_not": [ 
      { 
       "terms": { 
        "ADDRESS_FROM": { 
        "index": "clients", 
        "type": "client", 
        "id": "1", 
        "path": "Emails" 
        } 
       } 
      } 
     ] 
     } 
    } 
} 
+0

Вам нужно два запроса для что –

+0

кто-нибудь может указать мне в правильном направлении? спасибо – stackoverflows

+0

keety решил это с помощью одного запроса, см. принятый ответ ниже. – stackoverflows

ответ

1

Убедитесь, что Emails поле в индексе клиентов установлен в not_analyzed.

В идеале поле AddressForm должно быть массивом сообщений электронной почты. "ADDRESS_FROM" : ["[email protected]", "[email protected]"] т.е.

вместо

"ADDRESS_FROM" : "[email protected] [email protected]"

Если изменение структуры документа не вариант вам нужно будет использовать whitespace analyzer для AddressForm.

Ниже пример демонстрирует это:

PUT /clients 
{ 
    "mappings": { 
     "client": { 
     "properties": { 
      "FolderIDs": { 
       "type": "integer" 
      }, 
      "Emails" : { 
       "type": "string", 
       "index" : "not_analyzed" 
      } 
     } 
     } 
    } 
} 
PUT /clients/client/1 
{ 
    "id":"1", 
    "name":"Joe Doe", 
    "FolderIDs":["577173","245340","777035"], 
    "Emails" : ["[email protected]", "[email protected]"] 
} 

PUT /clients/client/2 
{ 
    "id":"1", 
    "name":"Joe Doe", 
    "FolderIDs":["577173","245340","777035"], 
    "Emails" : ["[email protected]", "[email protected]"] 
} 

PUT /emails 
{ 
    "mappings": { 
     "email": { 
     "properties": { 
      "EmailID": { 
       "type": "integer" 
      }, 
      "ADDRESS_FROM": { 
       "type": "string", 
       "analyzer": "whitespace" 
      } 
     } 
     } 
    } 
} 

PUT /emails/email/1 
{ 
    "EmailID": "8335", 
    "ADDRESS_FROM" : "[email protected] [email protected]" 
} 

Пример запроса 1:

POST emails/_search 
{ 
    "query": { 
     "filtered": { 
     "query": { 
      "match_all": {} 
     }, 
     "filter": { 
      "bool": { 
       "must_not": [ 
        { 
        "terms": { 
         "ADDRESS_FROM": { 
          "index": "clients", 
          "type": "client", 
          "id": "1", 
          "path": "Emails" 
         } 
        } 
        } 
       ] 
      } 
     } 
     } 
    } 
} 

"hits": { 
     "total": 1, 
     "max_score": 1, 
     "hits": [ 
     { 
      "_index": "emails", 
      "_type": "email", 
      "_id": "1", 
      "_score": 1, 
      "_source": { 
       "EmailID": "8335", 
       "ADDRESS_FROM": "[email protected] [email protected]" 
      } 
     } 
     ] 
    } 

Пример Query2 (0 хитов):

POST emails/_search 
{ 
    "query": { 
     "filtered": { 
     "query": { 
      "match_all": {} 
     }, 
     "filter": { 
      "bool": { 
       "must_not": [ 
        { 
        "terms": { 
         "ADDRESS_FROM": { 
          "index": "clients", 
          "type": "client", 
          "id": "2", 
          "path": "Emails" 
         } 
        } 
        } 
       ] 
      } 
     } 
     } 
    } 
} 

    "hits": { 
     "total": 0, 
     "max_score": null, 
     "hits": [] 
    } 
+0

Спасибо, сэр! – stackoverflows

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