Подключаемый модуль Grails ElasticSearch — Предложить запрос

Можно ли написать запрос предложения с помощью плагина? В документации плагина об этом ничего нет. Если это возможно, то как мне это сделать?

Вот документация по elasticsearch о запросах предложений: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-suggesters.html http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-suggesters-completion.html

Большое спасибо за ответ.


person Sergio Mendonça    schedule 14.09.2014    source источник
comment
Вы можете отправлять прямые http-запросы, получать JSON-ответы и сопоставлять их с классами домена.   -  person wwarlock    schedule 15.09.2014
comment
спасибо @wwarlock! не могли бы вы привести пример того, как мне это сделать?   -  person Sergio Mendonça    schedule 17.09.2014
comment
Да, могу, но мне нужно время, может быть, в ближайшие выходные.   -  person wwarlock    schedule 17.09.2014
comment
Мне очень жаль, все еще не было времени, чтобы написать это. Но я не забыл об этом.   -  person wwarlock    schedule 07.10.2014
comment
я видел, что плагин в настоящее время поддерживает предложение. но выполнение http-запроса к elasticsearch — это другой подход и обходной путь, пока плагин не поддерживает его. @SergioMendonça .. Как ты сейчас с этим справляешься?   -  person sufyan.shoaib    schedule 29.01.2015


Ответы (1)


Действительно, вам нужно отправить запрос непосредственно в Elastic Search. Ниже приведен код, который я использовал:

import groovyx.net.http.ContentType
import groovyx.net.http.Method
import org.apache.commons.lang.StringUtils
import org.apache.commons.lang.math.NumberUtils
import groovyx.net.http.HTTPBuilder
...

def suggestion = params.query

def http = new HTTPBuilder('http://localhost:9200/_suggest')
http.request(Method.POST, ContentType.JSON) {
    body = [
            'suggestion': [
                    'text': params.query,
                    'term': ["field": "_all"]
            ]
    ]

    response.success = { resp, json ->
        json?.suggestion?.each { s ->
            def oldWord = s?.text
            def newWord = s?.options[0]?.text ?: oldWord
            suggestion = StringUtils.replace(suggestion, oldWord, newWord)

        }
    }

    response.failure = { resp ->
        flash.error = "Request failed with status ${resp.status}"
    }
}
searchResult.suggestedQuery = suggestion

Обратите внимание, что это отрывок. Кроме того, я выполняю фактический поиск, а затем добавляю атрибут offerQuery к карте searchResult.

Выполните HTTP POST для службы _suggest, работающей с Elastic Search. В моем примере это было простое веб-приложение, работающее на одном сервере, поэтому с локальным хостом все было в порядке. Формат запроса — объект JSON, основанный на Elastic Search документация.

У нас есть два обработчика ответов — один для успеха, другой для ошибок. Мой обработчик успеха перебирает каждое слово, для которого было дано предложение, и выбирает лучшее (первое) предложение для каждого, если оно есть. Если вы хотите увидеть необработанные данные, вы можете временно добавить println(json).

И последнее замечание: при добавлении классов httpBuilder в проект вам, вероятно, потребуется исключить несколько уже предоставленных артефактов. А именно:

runtime('org.codehaus.groovy.modules.http-builder:http-builder:0.5.1') {
    excludes 'xalan'
    excludes 'xml-apis'
    excludes 'groovy'
}
person Domenic D.    schedule 18.02.2015