Поиск в спящем режиме: невозможно выполнить поиск по шаблону в текстовых полях с динамически отображаемым полем - PullRequest
0 голосов
/ 06 января 2020

Я реализовал пользовательский мост, который отображает все динамические c поля со связанными типами. Типы могут быть FieldType.STRING или FieldType.DOUBLE или FieldType.BOOLEAN в зависимости от значения.

Когда я посмотрел на сопоставление в моей поисковой схеме elasti c, все строковые поля сопоставлены с типом TEXT где я ожидаю, что это будет ключевое слово, так что я могу сделать поиск по шаблону.

Вот моя проблема Я хочу отфильтровать "AAA-VALUE" для динамически отображаемого поля 'attribute.dynami c -field-1'

У меня есть индексированное значение как «AAA-VALUE» для динамически отображаемого поля «attribute.dynami c -field-1 '

Если я хочу выполнить поиск по ключевому слову, я столкнулся с ошибкой типа« Мост поля не найден » затем я исправил ошибку, игнорируя мост с помощью ignoreFieldBridge, и ошибка исчезла.

Затем я снова попытался выполнить поиск со значением «AAA-VALUE», и результат оказался пустым (данные не найдены). Здесь я создал запрос, используя запрос ключевого слова ().

Затем я снова попытался выполнить запрос фразы, но он заработал, но проблема в том, как я могу выполнить поиск по шаблону, например ' -VALUE '.

Что касается кода , я следовал аналогичной реализации, как указано здесь https://github.com/hibernate/hibernate-search/blob/master/legacy/engine/src/test/java/org/hibernate/search/test/bridge/MultiFieldMapBridge.java

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

Моя версия поиска hibernate - hibernate-search.version и hibernate-search -asticsearch = 5.11.3.Final

1 Ответ

1 голос
/ 07 января 2020

Это сработало после внесения следующих изменений.

Так я добавил поля до

public class MultiFieldMapClassBridge implements MetadataProvidingFieldBridge {
;
;
;
luceneOptions.addFieldToDocument( fieldPrefix + "." + key, value, document );

}

Но поля должны быть добавлены, как показано ниже.

public class MultiFieldMapClassBridge implements MetadataProvidingFieldBridge {
;
;
org.apache.lucene.document.Field field = new org.apache.lucene.document.StringField(fieldPrefix + "." + key, value,  luceneOptions.getStore());
document.add(field);
}

Я написал запрос с подстановочными знаками, как показано ниже

queryBuilder.keyword().wildcard().onField(prefixedPath).ignoreFieldBridge().matching(String.format("*%s*", matchingString.toLowerCase(Locale.getDefault()))).createQuery();

Я понял это после прочтения этого do c, где мосты классов должны добавить поле как StringField. https://docs.jboss.org/hibernate/search/5.5/reference/en-US/html_single/#example -класс мост

...