Нечеткость существующего запроса ElasticSearch Java API

У меня есть существующий запрос ElasticSearch, использующий Java API:

BoolQueryBuilder queryBuilder = 
     boolQuery().should(queryStringQuery(theUsersQueryString)); 
SearchResponse response = client.prepareSearch(...).setQuery(queryBuilder);

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

boolQuery().should(queryStringQuery(theUsersQueryString)
              .fuzziness(Fuzziness.ONE)
              .fuzzyMaxExpansions(4)
              .fuzzyPrefixLength(2));

К сожалению, это не работает, и я до сих пор не смог найти хорошую документацию для этого. Например, у меня есть строка John Deere в моей базе данных. Если я использую строку запроса deere, я получаю совпадение, но не при использовании строк запроса Deeree или Deeer.

Мой вопрос: как мне правильно фаззифицировать мой запрос?


person Gruber    schedule 09.03.2016    source источник
comment
Вы прошли через это ?   -  person Val    schedule 09.03.2016
comment
@Val: Да, я надеялся, что мой предложенный выше код будет работать, поскольку я пробовал разные комбинации значений для параметров, но до сих пор мне не удалось получить нечеткие результаты, поэтому я думаю, что есть что-то еще, связанное с Java API.   -  person Gruber    schedule 09.03.2016
comment
Можете ли вы также показать некоторые примеры данных, значения, которые вы вводите в theUsersQueryString, и ожидаемые результаты?   -  person Val    schedule 09.03.2016
comment
@Val: вопрос отредактирован, чтобы включить простой пример.   -  person Gruber    schedule 09.03.2016
comment
Вы устанавливаете уровень нечеткости на 1, но затем делаете запросы с Deeree и Deeer, которые требуют 2 изменений, поскольку я вижу, что вы используете фильтр нижнего регистра (т. е. вам нужно сначала выполнить deeree, а затем отрезать последние e в deere). Попробуйте установить fuzziness(Fuzziness.TWO)   -  person Mateusz Dymczyk    schedule 09.03.2016
comment
на самом деле поцарапайте это (частично), я вижу, вы также используете fuzzy_prefix_length, в этом случае уровень нечеткости 1 должен работать, НО вам все равно нужно сделать запрос в нижнем регистре, т.е. deeree, поскольку первые 2 буквы во многом совпадают.   -  person Mateusz Dymczyk    schedule 09.03.2016


Ответы (1)


Я решил создать новый запрос, а не изменять существующий.

MultiMatchQueryBuilder fuzzyMmQueryBuilder = multiMatchQuery(
                theUsersQueryString, "field1", "field2", ... , "fieldn").fuzziness("AUTO");
BoolQueryBuilder b = boolQuery().should(fuzzyMmQueryBuilder); 
SearchRequestBuilder srb = client.prepareSearch(...).setQuery(b)... 
SearchResponse res = srb.execute().actionGet();

Этот запрос демонстрирует нечеткое поведение.

person Gruber    schedule 10.03.2016