2015-08-24 4 views
2

Я просто запускаю агрегирование в плагине браузера (чудо), как вы видите на рисунке ниже, только один документ соответствует запросу, но агрегирован, разделенный пробелами, но это не имеет смысла. Я хочу, чтобы агрегат для разных документов .. В этом сценарии должна быть только одна группа с номером 1 и ключом: «Drow Ranger». Каков истинный способ сделать это в elasticsearch .. enter image description hereelasticsearch aggregations разделенные слова

ответ

1

Это, вероятно, потому, что ваш heroname поле analyzed и, таким образом, «Дроу Ranger» получает лексемы и индексируются как «дроу» и «рейнджер».

Один из способов обойти это, чтобы превратить ваш heroname поле в нескольких местах с анализируемой части (тот, который вы поиск по с запросом подстановочные) и другой not_analyzed части (один можно агрегировать на).

Вы должны создать свой индекс, как это и указать правильное отображение для heroname поля

curl -XPUT localhost:9200/dota2 -d '{ 
    "mappings": { 
     "agust": { 
      "properties": { 
       "heroname": { 
        "type": "string", 
        "fields": { 
         "raw: { 
          "type": "string", 
          "index": "not_analyzed" 
         } 
        } 
       }, 
       ... your other fields go here 
      } 
     } 
    } 
} 

Затем вы можете запустить агрегацию на heroname.raw поле вместо heroname поля.

UPDATE

Если вы просто хотите попробовать на heroname поле, вы можете просто изменить это поле, а не воссоздать весь индекс. Если вы выполните следующую команду, она просто добавит новое поле heroname.raw в существующее поле heroname. Обратите внимание, что вам все равно придется индексировать данные, хотя

curl -XPUT localhost:9200/dota2/_mapping/agust -d '{ 
    "properties": { 
     "heroname": { 
      "type": "string", 
      "fields": { 
       "raw: { 
        "type": "string", 
        "index": "not_analyzed" 
       } 
      } 
     } 
    } 
} 

Тогда вы можете продолжать использовать heroname в вашем wildcard запросе, но ваша агрегация будет выглядеть следующим образом:

{ 
    "aggs": { 
     "asd": { 
      "terms": { 
       "field": "heroname.raw", <--- use the raw field here 
       "size": 0 
      } 
     } 
    } 
} 
+1

Я знаю, что это из-за мой индекс поля проанализированы. но если я сделаю это на этот раз, я не смогу сделать «регистр без учета регистра». Я имею в виду, что я уже сделал это, и я запускаю запрос «... wildcard: * d *» ... он не работает, но * D * работает .. так как же заставить обе эти работы? –

+3

Нечувствительный к регистру поиск по шаблону будет работать в поле «heroname», и агрегация будет работать против поля «heroname.raw». Все, что мы делаем, это добавить новое поле ('heroname.raw'), не меняя того, которое уже работает (' heroname'). Попробуйте. – Val

+0

Я понял, что вы имеете в виду, а также отлично работает !, спасибо :) С уважением, –