Параметры Solr's SnowballPorterFilterFactory и Wildcard - PullRequest
3 голосов
/ 23 июля 2010

У меня проблема с запросом к Solr с использованием следующего типа поля:

<fieldType name="text_ci" class="solr.TextField" positionIncrementGap="100">
   <analyzer>
      <tokenizer class="solr.WhitespaceTokenizerFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true"/>
       <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
   </analyzer>
</fieldType>

Как вы можете видеть, он применяет SnowballPorterFilterFactory при индексации и запросах.Если я индексирую что-то вроде

Мышь и веселье

Это индексируется как:

Index Breakdown in Solr

Как вы можетесм. слово «Мышь» превращено в «Мус» с помощью «SnowballPorterFilterFactory».Что мы и хотим.Однако, когда мы ищем

Мышь *

Кажется, что «SnowballPorterFilterFactory» не применяется таким же образом.Я думаю, из-за * в конце.

Query Breakdown in Solr

Мой вопрос: есть ли способ, чтобы "SnowballPorterFilterFactory" узнал о подстановочных знаках?Так что, когда я запрашиваю

Мышь *

, я не получаю 0 результатов.

Интересно, если я запрашиваю

mous *

Запись возвращается.

Или кто-то может предложить лучший способ запроса / индексации этого типа поля?

Спасибо, Дейв

Ответы [ 2 ]

2 голосов
/ 28 июля 2010

Из FAQ :

В отличие от других типов запросов Lucene, подстановочные, префиксные и нечеткие запросы не передаются через анализатор, который является компонентом, выполняющим такие операции, как постановка и нижний регистр. Причиной пропуска Анализатора является то, что если вы искали «dogs *», вы бы не хотели, чтобы «dogs» сначала были переведены в «dog», так как это соответствовало бы «dog *», что не является предполагаемым запросом. Эти запросы в любом случае не чувствительны к регистру, потому что QueryParser делает их строчными. Это поведение можно изменить с помощью метода setLowercaseExpandedTerms (логический)

Если у вас все в порядке с изменением источника Solr, SOLR-757 имеет патч, который может оказаться полезным. Я не знаю, как изменить это, кроме как погрузиться в источник.

Что может быть более простой идеей: просто имейте поле для копирования, которое не имеет основы. Пользователь может искать в обоих этих полях, и тогда мышь * будет совпадать в поле, не являющемся основанием.

(РЕДАКТИРОВАТЬ: на самом деле, глядя на этот патч, я не уверен, что он будет делать то, что вы хотите. Но в основном вам просто нужно поменять обработчик запросов, чтобы он работал первым.)

2 голосов
/ 23 июля 2010

В последний раз, когда я проверяю, когда вы используете подстановочные знаки, анализатор запросов не используется. Так как вы используете LowerCaseFilterFactory, ваши термины индексируются строчными буквами, и поиск Mous * ничего не даст.

Я думаю, что единственное, что нужно сделать при использовании подстановочных знаков, - это убедиться, что ваш запрос адаптирован к тому, как индексируются ваши термины (аналогично тому, что будет делать ваш анализатор запросов).

...