Tire и Elasticsearch SearchRequestFailed SearchPhaseExecutionException

Я реализовал Tire с elasticsearch. Локально мой проект работает нормально, и у меня нет проблем с поиском в моем файле index. Но когда я развернул свое приложение на своем сервере, я получил это сообщение об ошибке:

Tire::Search::SearchRequestFailed (500 : {"error":"SearchPhaseExecutionException[Не удалось выполнить фазу [query_fetch], полный сбой; shardFailures {[hDTlT_K_Sl6P5regwKNJyg][статьи] [0]: QueryPhaseExecutionException[[статьи][0]: query[ConstantScore(NotDeleted(cache(_type:article)))],from[0],size[25],sort[!]: Query Failed [Не удалось выполнить основной запрос]]; вложенный: IOException[Can't sort для строковых типов с более чем одним значением на документ или более чем одним токеном на поле]; }]","status":500}):

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

curl -XPOST 'http://localhost:9200/articles/article/_search' -d '{ 
    "sort": [ 
        { 
            "supplier_code": "desc" 
        } 
    ] 
}'

И получил практически такой же ответ:

{"error":"SearchPhaseExecutionException[Не удалось выполнить фазу [query_fetch], полный сбой; shardFailures {[hDTlT_K_Sl6P5regwKNJyg][статьи][0]: QueryPhaseExecutionException[[статьи][0]: запрос[ConstantScore(NotDeleted(cache(_type: article)))],from[0],size[10],sort[!]: Query Failed [Не удалось выполнить основной запрос]]; вложенный: IOException[Не удается отсортировать строковые типы с более чем одним значением в документе , или более одного токена на поле]; }]","status":500}

Так может ли кто-нибудь указать мне в правильном направлении? Я скопировал именно ту конфигурацию Сэма, которую использую на своем локальном компьютере. Странно что на сервере не работает.

Что мне здесь не хватает?

Заранее большое спасибо

РЕДАКТИРОВАТЬ:

Я обнаружил, что сортировка, которую я пытаюсь выполнить, вызывает проблему. Кроме того, это как-то связано с сопоставлением объекта моей статьи с эластичным поиском.

Что-то с полем пытаюсь разобраться поставить на not_analyzed Я правильно понимаю? Нужно ли явно сопоставлять все мои поля, если я сопоставляю только одно поле?


person Niels    schedule 06.09.2012    source источник


Ответы (1)


Это фактическая проблема: Невозможно сортировать строковые типы с более чем одним значением в документе или более чем с одним токеном в поле. Это означает одно из двух: либо у вас есть несколько supplier_code полей в каждом документе. документ или поле supplier_code анализируется анализатором, который создает несколько токенов (анализатор по умолчанию будет делать это для некоторых строк). Elasticsearch может сортировать только те поля, которые содержат не более одного значения на запись. Итак, если у вас есть несколько полей, вам нужно придумать другой ключ сортировки, или если у вас есть одно поле, вам нужно сделать его not_analyzed или использовать какой-то другой анализатор, который не создает несколько токенов.

person imotov    schedule 06.09.2012
comment
Спасибо за пояснение, какой анализатор можно использовать, чтобы использовать поле для поиска и сортировки? Также, если я добавлю какое-то сопоставление, нужно ли мне явно отображать все мои поля моей модели? - person Niels; 07.09.2012
comment
Это зависит от вашего варианта использования поиска. Подойдет любой анализатор, выдающий не более одного токена. Если ваш вариант использования требует разделения содержимого поля на несколько токенов, вы можете использовать Multi Field, чтобы проиндексировать поле дважды. Вы можете сопоставить только одно поле, оставив все остальные поля динамическими. Однако, если поле уже было сопоставлено динамически, вам необходимо заново создать индекс. - person imotov; 07.09.2012