2016-10-20 3 views
0

Я использую solr для поиска имен и для совпадения с частичными совпадениями. Используя минимум 2 я получаю следующие ngrams для "Bob Smith":Как включить Solr ngrams

  • бо
  • боб
  • см
  • сми
  • Smit
  • кузнец

Этот однако не включает «bob s» и ничего не возвращает, если я ищу этот запрос. Какие существуют варианты включения этого формата в ngrams? Вот полевое поле, которое я использую:

<fieldType name="edgytext" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="25" /> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    </fieldType> 

ответ

1

Поскольку вы используете разные токенизаторы, результаты будут разными. KeywordTokenizer предоставит вам только вход для поиска в виде единственного токена. Использование StandardTokenizer будет работать, но даст «smith bob» в качестве предложения «кузнец-боб».

Альтернативы является index the content as shingles as well - позволяет создавать черепицу из маркеров (пример, приведенная только с двумя используемыми для гальки поколения):

Боба Смит мл. => bob smith, smith jr.

.., а затем генерировать edgengrams основанные на том, что дает вам:

Бо ЛПП боб Боба сек боб см ...

и т.д. галька завод также будет включать фактические маркер по умолчанию, так что вы все равно должны быть в состоянии найти только «кузнец» и т.д.

<analyzer type="index"> 
<tokenizer class="solr.StandardTokenizerFactory"/> 
<filter class="solr.LowerCaseFilterFactory"/> 
<filter class="solr.ShingleFilterFactory"/> 
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="25" /> 
</analyzer> 

.. должны дать вам больше маркеров, которые позволяют у ou соответствуют токенам, следующим друг за другом. Вы можете настроить maxShingleSize, если хотите добавить не более двух последовательных токенов.

Кроме того, если вы просто хотите сделать автозаполнение от начала текста, используйте KeywordTokenizer с нижестоящим фильтром для индексирования и использования подстановочного знака для поиска (если вы строчите текст перед отправкой в ​​Solr, так как весь анализ пропускается для подстановочных знаков). Это также будет работать с edgengram вместе с KeywordTokenizer.

+0

Это решение работало для меня с точки зрения создаваемой ngram, но по какой-то причине, если я ищу «bob s», я ничего не получаю, но если я ищу «bob sm», я получаю желаемый результат. Я пробовал с обоими с 1 и 2. – user3688241

+0

Используйте вкладку «Анализ» под администрацией interfaceto, где сравнивается сравнение. – MatsLindh

0

Вам нужно будет использовать KeywordTokenizerFactory на анализаторе индекса, а также анализатор запросов, например:

<fieldType name="edgytext" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="25" /> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    </fieldType> 

Таким образом, при индексировании вы будете применять edgeNgram фильтр для всей строки, а не жетоны. Он будет обозначаться как «bob smith» (вместо «bob», «smith», который у вас был в StandardTokenizer), затем отфильтрован как «b», «bo», «bob», «bob s» и т. Д.

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