Как настроить SOLR, чтобы пользователи могли выполнять поиск по префиксу по умолчанию? - PullRequest
6 голосов
/ 21 сентября 2011

Я использую SOLR 3.2. Мое приложение выдает поисковые запросы на экземпляре SOLR для типа текстового поля. Как сделать так, чтобы SOLR возвращал результаты, такие как «book», «bookshelf», «bookasd» и т. Д., Когда пользователь выдает запрос типа «book». Должен ли я добавлять символы «*» в строку запроса вручную или в SOLR есть настройка, чтобы по умолчанию выполнялся поиск по префиксу?

Это раздел schema.xml для типа текстового поля:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <charFilter class="solr.HTMLStripCharFilterFactory"/>
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.StopFilterFactory"
                ignoreCase="true"
                words="stopwords.txt"
                enablePositionIncrements="true"
                />
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="1" splitOnCaseChange="0"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
      </analyzer>
      <analyzer type="query">
        <charFilter class="solr.HTMLStripCharFilterFactory"/>
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenat0All="1" splitOnCaseChange="0"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
      </analyzer>
    </fieldType>

Ответы [ 4 ]

2 голосов
/ 21 сентября 2011

Есть несколько способов сделать это, но с точки зрения производительности вы можете использовать EdgeNgramFilterFacortory

1 голос
/ 21 сентября 2011

У меня было такое же требование к проекту.Я должен был реализовать предложение.Что я сделал, так это определил поле подсказки fieldType

<fieldType class="solr.TextField" name="suggester">
    <analyzer  type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>

        <filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="3" outputUnigrams="true" outputUnigramsIfNoShingles="false" />
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_en.txt" enablePositionIncrements="true" />
    </analyzer>
    <analyzer  type="query">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
</fieldType>

Я использовал ShingleFilterFactory, потому что мне нужно было получить предложение, состоящее из одного или нескольких слов.

Затем я использовал фасетные запросы для получения предложений.

Facet.Limit = 10

Facet.Prefix = "book"

Facet.Field = "Suggester" // это поле с fieldType =«советчик» , в котором я сохранил данные

Я знаю, что он использует побочные эффекты, но, возможно, это решит вашу проблему.

Если мой или ответ Джаендры Патил не предоставляет вам решения, вы также можете взглянуть на EdgeNGramFilterFactory

0 голосов
/ 22 февраля 2012

Я уверен, что вы уже поняли это, но просто здесь есть ответ:

Я обработал это, взяв последний член и поставив ИЛИ с последним термином плюс подстановочный знак, например "моя любимая книга "становится" моей + любимой + (книга ИЛИ книга *) "и возвращает" моя любимая книжная полка ".Возможно, вы все равно захотите выполнить некоторую обработку входных данных (экранирование и т. Д.).

Если вы специально ищете текст, набранный в соответствии с началом результата, тогда n-граммы ребер - это путь, но, прочитав ваш вопрос, вы, похоже, не спрашивали об этом.

0 голосов
/ 21 сентября 2011

Вы должны либо выполнить обработку на стороне клиента, добавив символы подстановки в конце условий поиска.

Влияние: -

  1. Подстановочные запросы имеютвлияние на производительность
  2. Подстановочные запросы не подвергаются анализу.Таким образом, анализ времени запроса не будет применяться к поисковым терминам

Другой вариант - реализовать собственный анализатор запросов с необходимой вам обработкой.

...