2017-01-07 3 views
1

У меня есть поиск много раз, но не можешь исправить мою проблему, вот мой код:поиска Apache Lucene с стопами-словами

BooleanJunction<BooleanJunction> booleanJunction = queryBuilder.bool(); 

    String[] fields = new String[]{"field1","field2","field2"}; 
    MultiFieldQueryParser mfqp = new MultiFieldQueryParser(fields,new StandardAnalyzer(CharArraySet.EMPTY_SET)); 
    for (String token : tokens) { 
     booleanJunction.should(mfqp.parse(token + "*")); 
    } 

в данном случае не является исключением, когда маркер стоп-слова (а, ап, и т. д.), но он не ищет точные ключевые слова.

Например, если есть индексированный «andtest», он возвращает этот элемент, но если есть «и тест», он не ищет этот элемент.

Не могли бы вы дать мне совет, что здесь не так?

ответ

1

Когда вы индексируете «и проверяете», StandardAnalyzer (который по умолчанию) будет обозначать это как два разных термина: «и» и «тест». Таким образом, поиск «и test *» не будет соответствовать документу с «и тестом» в нем.

Обычный способ сопоставления нескольких терминов в документе заключается в использовании фразовых запросов, но those don't support wildcards.

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

Для получения дополнительной информации об аналитических концепциях вы, вероятно, смотрите в this resource (here). Это документация Solr, поэтому некоторые концепции не имеют к вам отношения (в частности, фрагменты XML), но все еще важны концепции высокого уровня (токенизация, фильтрация, генерация, ...). И самое главное, эта страница содержит список анализаторов/токенизаторов/фильтров, и все они могут использоваться в Hibernate Search/Lucene.

Для всего, что связанно с настройкой анализаторов в спящем режиме поиска, посмотри here

На стороне записки, если вы добавляете подстановки («*») самостоятельно, это, вероятно, означает, что вы должны использовать пользовательский анализатор с edgeNGramFilter. Но это немного сложнее, так как при индексировании и при запросе вам придется использовать разные анализаторы. Поэтому подстановочный знак должен быть в порядке на данный момент :)

Смежные вопросы