Выражение сравнения текста в Cloudsearch

Я пытаюсь добавить выражение в запрос cloudsearch, которое сравнивает строку и устанавливает значение на ее основе.

Похоже, что cloudsearch не может сделать это с текстовыми полями.

Согласно документам, одним из способов запуска выражений является «Целочисленные, с плавающей запятой, шестнадцатеричные и восьмеричные литералы».

(http://docs.aws.amazon.com/cloudsearch/latest/developerguide/configuring-expressions.html)

Итак, я преобразовал строку в MD5, которая должна быть шестнадцатеричным числом.

Поместите значение в поле, установленное как тип «литерал».

но я получаю ошибку

Non-numeric field fieldname cannot be used in expression

Какой метод я могу использовать для запуска выражения для достижения того, что мне нужно сделать?


person Charlie Smith    schedule 07.01.2016    source источник
comment
У меня похожая проблема. У вас есть решение?   -  person Ali Mehdi    schedule 24.06.2016


Ответы (2)


Выражения настроены на сортировку результатов поиска, но, прежде всего, вы можете

  • определить несколько терминов в анализаторе запросов, чтобы наказывать документы, которые не соответствуют вашим критериям
  • а также указать SortEnabled полей и присвоить веса выбранным полям

Примеры взвешивания и поиска литеральных строк

genres:'Sci-Fi'

or

q.options={fields:['title^2','plot^0.5']} 

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

facet.genres={buckets:["Action","Adventure","Sci-Fi"]}

Подробнее об аспектах сегментирования читайте в документах. .

Наконец, при настройке выражения вы можете использовать показатель релевантности документа (_score), основанный на том, как часто поисковые запросы появляются в документе, как показано в уже упомянутой вами ссылке.

(0.3*popularity)+(0.7*_score)
person Community    schedule 30.06.2016

Поскольку, как вы говорите, выражения могут быть определены только в числовых полях, вы не можете использовать их непосредственно в порядке сортировки. Но, приложив немного усилий, вы можете сделать структурированный поиск (q.parser=structured), который увеличит значение _score, если ваше текстовое поле соответствует заданному значению.

Я говорю, что это немного запутанно, потому что вам нужно объединить две версии запроса с (или) - одну с усилением и одну без.

Таким образом, чтобы использовать пример в другом ответе (где вы хотите дать повышение, где genre соответствует «Научная фантастика»), ваш запрос становится (or (and <OLD_QUERY> (term field=genre boost=2.5 'Sci-Fi')) <OLD_QUERY>), где ‹OLD_QUERY› может, например, быть (prefix 'Bladerun') или что-то еще, что ищет пользователь.

Другими словами: ЛИБО совпадение для исходного запроса, где жанр='Научная фантастика', увеличенное на 2,5, ЛИБО совпадение для того же запроса в любом жанре без усиления.

Больно, но работает!

person andygeers    schedule 22.07.2020