Функция автозаполнения с использованием Solr4 на многозначных полях
Я видел сообщения о выполнении автозаполнения по нескольким полям, но не о выполнении автозаполнения по многозначным полям.
Моя функция автозаполнения работает для не многозначных полей.
Моя проблема заключается в том, что когда я запускаю запрос в многозначном поле, там, где документ соответствует этому запросу, все поля в многозначном поле этого документа возвращаются в результатах фасета.
Ниже приведена моя схема, аналогичная той, что предлагается в Solr 4 Cookbook.
<fieldType name="text_autocomplete" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="25" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
<field name="publisherText-str" type="string" indexed="true" stored="false" multiValued="true"/>
<field name="publisherText-ac" type="text_autocomplete" indexed="true" stored="true" required="false" multiValued="true"/>
Как видите, publisherText - это многозначное поле. Я выполняю запрос, как этот, чтобы проверить функцию автозаполнения:
/select?q=publisherText-ac:new&facet=true&facet.field=publisherText-str&facet.mincount=1&rows=0
Запрос является "новым", и это соответствует набору документов. Однако набор результатов фасета содержит другие значения publisherText (содержащиеся в многозначном поле) для каждого соответствующего документа.
Обновление: при запросе "new" набор результатов должен включать "New York Times" и "Times New Roman", но не должен решать проблему с инфиксами: "Knewton Gazette" не обязательно должен быть в наборе результатов.
Есть ли способ, чтобы побочный результат содержал только значения, соответствующие запросу? Или есть другой (лучший?) Способ поддержки функции полного автозаполнения, которая более изящно обрабатывает многозначные поля?
Благодарю.
3 ответа
Я думаю, что наиболее оптимальным способом было бы создать отдельную коллекцию или ядро (в зависимости от того, используете вы облако или нет) и индексировать свои данные таким образом, чтобы это могли быть запросы для желаемого результата запроса. Конечно, это может быть невозможно в некоторых случаях, но если это в вашем случае, пойти на это. В таком ядре у вас будут только поля и данные, относящиеся к вашему автозаполнению, поэтому в большинстве случаев оно будет меньше исходного ядра, меньше терминов, что должно привести к более быстрым запросам. Кроме того, такое ядро или набор оптимизированы для автозаполнения запросов, и вы получите от этого еще большую производительность.
Однако, если вы не можете использовать подход с несколькими ядрами / коллекциями, выделение может быть лучшим способом, если вам нужна фильтрация. В таком случае вы можете захотеть включить терминоры терминов и использовать FastVectorHighlighting для повышения производительности подсвечивания Solr ( http://solr.pl/en/2011/06/13/solr-3-1-fastvectorhighlighting/).
Пока что я использовал эти два способа:
(A) придерживайтесь использования фасетов и принимайте, что вы должны уменьшить результат с помощью регулярного выражения или String.startsWith. На самом деле это может быть не так уж плохо, если вы используете компоненты внешнего интерфейса, такие как плагин YUI3 Autocomplete, который предлагает эту функцию уже без необходимости делать с ней много.
(B) используйте выделение, добавив к вашему запросу:
&hl=true&hl.fl=publisherText-ac
Для каждого попадания компонент подсветки будет возвращать соответствующее значение, включая теги подсветки (по умолчанию <em>
). Это еще более полезно, если ваше поле автозаполнения получено из нескольких полей ввода, и вы не хотите искать в результатах, чтобы выяснить, какое поле содержит соответствующее значение. Однако полученный список может содержать дубликаты.
Я использую оба подхода, (A) для автозаполнения на отдельных полях, (B) при поиске автозаполнения из нескольких полей. Я пытался избавиться от <em>
теги, включенные в результаты выделения, но это оказалось совершенно невозможным (вы можете только изменить их, но не удалить их полностью).
(здесь используется SOLR 4.0)
Вы можете просто использовать facet.prefix=new
параметр, и пусть Solr отфильтровать эти записи для вас. То, что я также хотел бы рассмотреть, это избегать нграмм здесь. Создание аспекта и использование facet.prefix
делает трюк уже Надеюсь, у вас не будет слишком много уникальных терминов и производительность будет в порядке.