2016-05-20 2 views
1

У меня есть документ, который выглядит следующим образом:Elasticsearch - Cardinality над Full Field Value

{ 
    "_id":"some_id_value", 
    "_source":{ 
     "client":{ 
     "name":"x" 
     }, 
     "project":{ 
     "name":"x November 2016" 
     } 
    } 
} 

Я пытаюсь выполнить запрос, который закачает мне количество уникальных имен проекта для каждого клиента. Для этого я использую запрос с cardinality по project.name. Я уверен, что для этого конкретного клиента есть только 4 уникальных имен проектов. Однако, когда я запускаю свой запрос, я получаю счет 5, который, как я знаю, ошибочен.

Имена проектов содержат имя клиента. Например, если клиентом является «X», имена проектов будут «X Testing November 2016» или «X Jan 2016» и т. Д. Я не знаю, является ли это соображением.

Это отображение для типа документа

{ 
    "mappings":{ 
     "vma_docs":{ 
     "properties":{ 
      "client":{ 
       "properties":{ 
        "contact":{ 
        "type":"string" 
        }, 
        "name":{ 
        "type":"string" 
        } 
       } 
      }, 
      "project":{ 
       "properties":{ 
        "end_date":{ 
        "format":"yyyy-MM-dd", 
        "type":"date" 
        }, 
        "project_type":{ 
        "type":"string" 
        }, 
        "name":{ 
        "type":"string" 
        }, 
        "project_manager":{ 
        "index":"not_analyzed", 
        "type":"string" 
        }, 
        "start_date":{ 
        "format":"yyyy-MM-dd", 
        "type":"date" 
        } 
       } 
      } 
     } 
     } 
    } 
} 

Это мой поисковый запрос

{ 
    "fields":[ 
     "client.name", 
     "project.name" 
    ], 
    "query":{ 
     "bool":{ 
     "must":{ 
      "match":{ 
       "client.name":{ 
        "operator":"and", 
        "query":"ABC systems" 
       } 
      } 
     } 
     } 
    }, 
    "aggs":{ 
     "num_projects":{ 
     "cardinality":{ 
      "field":"project.name" 
     } 
     } 
    }, 
    "size":5 
} 

Таковы результаты, которые я получаю (я только отправил 2 результаты для краткости) , Убедитесь, что агрегация num_projects возвращает 5, но должна возвращать только 4, что является общим количеством проектов.

{ 
    "hits":{ 
     "hits":[ 
     { 
      "_score":5.8553367, 
      "_type":"vma_docs", 
      "_id":"AVTMIM9IBwwoAW3mzgKz", 
      "fields":{ 
       "project.name":[ 
        "ABC" 
       ], 
       "client.name":[ 
        "ABC systems Pvt Ltd" 
       ] 
      }, 
      "_index":"vma" 
     }, 
     { 
      "_score":5.8553367, 
      "_type":"vma_docs", 
      "_id":"AVTMIM9YBwwoAW3mzgK2", 
      "fields":{ 
       "project.name":[ 
        "ABC" 
       ], 
       "client.name":[ 
        "ABC systems Pvt Ltd" 
       ] 
      }, 
      "_index":"vma" 
     } 
     ], 
     "total":18, 
     "max_score":5.8553367 
    }, 
    "_shards":{ 
     "successful":5, 
     "failed":0, 
     "total":5 
    }, 
    "took":4, 
    "aggregations":{ 
     "num_projects":{ 
     "value":5 
     } 
    }, 
    "timed_out":false 
} 

FYI: Названия проекта являются ABC, ABC Nov 2016, ABC retest November, ABC Mobile App

+0

Можете ли вы представить суть своего тестового сценария? (отображение индекса, некоторые образцы данных и запрос) –

+0

@AndreiStefan - Я добавил детали, которые вы просили. Надеюсь, поможет. –

ответ

1

Вам необходимо следующее отображение для вашего project.name поле:

{ 
    "mappings": { 
    "vma_docs": { 
     "properties": { 
     "client": { 
      "properties": { 
      "contact": { 
       "type": "string" 
      }, 
      "name": { 
       "type": "string" 
      } 
      } 
     }, 
     "project": { 
      "properties": { 
      "end_date": { 
       "format": "yyyy-MM-dd", 
       "type": "date" 
      }, 
      "project_type": { 
       "type": "string" 
      }, 
      "name": { 
       "type": "string", 
       "fields": { 
       "raw": { 
        "type": "string", 
        "index": "not_analyzed" 
       } 
       } 
      }, 
      "project_manager": { 
       "index": "not_analyzed", 
       "type": "string" 
      }, 
      "start_date": { 
       "format": "yyyy-MM-dd", 
       "type": "date" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Это в основном подполе называется raw где же значение, помещенное в project.name, помещается в project.name.raw, но не касаясь его (токенизация или анализ). И тогда нужен вам запрос:

{ 
    "fields": [ 
    "client.name", 
    "project.name" 
    ], 
    "query": { 
    "bool": { 
     "must": { 
     "match": { 
      "client.name": { 
      "operator": "and", 
      "query": "ABC systems" 
      } 
     } 
     } 
    } 
    }, 
    "aggs": { 
    "num_projects": { 
     "cardinality": { 
     "field": "project.name.raw" 
     } 
    } 
    }, 
    "size": 5 
} 
Смежные вопросы