У меня есть фрагмент, который получает результаты поиска из спящего режима с использованием apache lucene. Когда я ввожу параметр поиска, например, «колледж», результаты слов, начинающихся с колледжа, появляются под номером ниже результатов поиска. Учитывая результат, я решил отсортировать набор результатов, и ниже приведен мой подход, но он не работает должным образом.
org.apache.lucene.search.Query luceneQuery = qb.keyword().fuzzy().withThreshold(.8f)
.withPrefixLength(1).onFields("fieldName").boostedTo(3)
.matching(searchTerm).createQuery();
// org.hibernate.search.FullTextQuery query = s.createFullTextQuery( luceneQuery, MyEntity.class );
// org.apache.lucene.search.Sort sort = new Sort(
// SortField.FIELD_SCORE,
// new SortField("id", SortField.STRING, true));
// luceneQuery.setSort(sort);
// List results = query.list();
Из приведенного выше фрагмента я должен закомментировать алгоритм сортировки, который я реализую, из-за строк с ошибками.
Hibernate Search сортирует по релевантности (оценке) по умолчанию, поэтому вам не нужно добавлять пользовательскую сортировку.
Если некоторые результаты недостаточно высоки в списке результатов, это означает, что их оценка недостаточно высока. Чтобы контролировать их оценку, самое простое решение, вероятно, состоит в том, чтобы добавить больше запросов. Как правило, чем большему количеству запросов соответствует конкретный документ, тем выше его оценка.
В этом случае вы можете попробовать что-то вроде этого:
org.apache.lucene.search.Query fuzzyQuery = qb.keyword().fuzzy().withThreshold(.8f)
.withPrefixLength(1).onFields("fieldName").boostedTo(3)
.matching(searchTerm).createQuery();
org.apache.lucene.search.Query exactQuery = qb.keyword().onFields("fieldName").boostedTo(10)
.matching(searchTerm).createQuery();
org.apache.lucene.search.Query luceneQuery = qb.bool()
.should(fuzzyQuery)
.should(exactQuery)
.createQuery();
Тогда документы будут совпадать, если они точно или приблизительно содержат слово «колледж», но если они точно содержат слово «колледж», они будут соответствовать обоим запросам, иметь более высокий балл и отображаться выше в списке результатов.
Если ваш вопрос действительно был о документах, которые сначала содержат термин «колледж», т. е. дать более высокий балл документам, которые содержат искомый термин в начале, то вы, вероятно, тоже можете это сделать, но это более необычный вариант использования. Просто добавьте еще одно предложение .should()
с SpanQuery
. Вы можете найти больше информации в этом ответе.
Это похоже на несвязанный вопрос... но нет, вам не нужно переиндексировать после вставки/обновления. Hibernate Search имеет функцию под названием автоматическое индексирование, которая позаботится об этом.
если я сначала проиндексирую только один раз, нужно ли мне индексировать все новые записи