Я реализовал именно то, о чем вы спрашиваете, и это работает очень хорошо.Необходимо учитывать две проблемы:
- Подсветка в сводках списка результатов не работает, и предлагаемый обходной путь также не работает в данном конкретном случае.
- Если вашДокументы имеют длинные заголовки и обрезают их при отображении, есть вероятность, что вы будете соответствовать по префиксу слова, которое не отображается.Конечно, есть несколько способов справиться с этим.
- И в будущей версии я хотел бы придать словам в начале названия немного больший вес, чем словам в конце.Это был бы один из способов смягчить предыдущий элемент.
Как и предыдущий ответ, я бы начал с той же статьи, на которую ссылается выше, но вам действительно нужен анализатор Edge NGram.То, что вы добавите, - это ТАКЖЕ делать токенизацию пробелов.
И затем вы внесете эти изменения в свой файл schema.xml.В этом примере предполагается, что у вас уже есть поле с названием «title», и это то, что вы хотели бы также отобразить.Я создаю второе поле, которое ТОЛЬКО используется для сопоставления префиксов автозаполнения.
Шаг 1. Определение типа текстового поля Edge NGram
<types>
<!-- ... other types ... -->
<!-- Assuming you already have this -->
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
... normal text definition ...
</fieldType>
<!-- Adding this -->
<fieldType name="prefix_edge_text" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<!-- not using enablePositionIncrements="true" for now -->
<filter class="solr.StopFilterFactory" words="stopwords.txt" />
<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="25" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<!-- No need to create Edges here -->
<!-- Don't want stopwords here -->
</analyzer>
</fieldType>
</types>
Шаг 2. Определение нового поля
<fields>
<!-- ... other fields ... -->
<!-- Assuming you already have this -->
<field name="title" type="text" indexed="true" stored="true" multiValued="true"/>
<!-- Adding this -->
<field name="prefix_title" type="prefix_edge_text" indexed="true" stored="true" multiValued="true" />
</fields>
Шаг 3: Скопируйте содержимое заголовка в поле префикса во время индексации
<!-- Adding this -->
<copyField source="title" dest="prefix_title" />
Это почти то же самое для схемы.Просто запомните:
- Когда вы выполняете обычный поиск, вы все равно выполняете поиск по обычному полю title .
- Когда вы выполняете поиск по автозаполнению, выполняйте поискпротив prefix_title .