2017-01-28 4 views
0

КК: snknop38we.azurewebsites.net/Solr номера поиска по сайту

Пример запроса: Solr: получение «д = (111 и (опубликовано: True) И ((entity_type_id: 19)) и ((available_start_date_time_utc : [* СЕЙЧАС]) ИЛИ (: -available_start_date_time_utc: [* TO *])) AND ((available_end_date_time_utc: [СЕЙЧАС В ]) ИЛИ (: * -available_end_date_time_utc: [* TO *]))), start = 0, rows = 20, qf = name short_description опубликовано = true is_out_of_stock = false, hl = true, hl.fl = name, short_description 'from'/spell '

Ожидаемые результаты: VM11110xl Kramer

Текущих результаты:

enter image description here

Схема типа для названия & краткого описания полого

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true"> 
      <analyzer type="index"> 
        <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-FoldToASCII.txt"/> 
        <charFilter class="solr.HTMLStripCharFilterFactory"/> 
        <tokenizer class="solr.StandardTokenizerFactory"/> 
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ru.txt"/> 
        <filter class="solr.LowerCaseFilterFactory"/> 
        <!--<filter class="solr.SnowballPorterFilterFactory" language="Russian" protected="lang/protwords_lt.txt"/>--> 
        <filter class="solr.PorterStemFilterFactory"/> 
      </analyzer> 
      <analyzer type="query"> 
        <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-FoldToASCII.txt"/> 
        <tokenizer class="solr.StandardTokenizerFactory"/> 
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ru.txt"/> 
        <!--<filter class="solr.SynonymFilterFactory" synonyms="lang/synonyms_ru.txt" ignoreCase="true" expand="true"/>--> 
        <filter class="solr.LowerCaseFilterFactory"/> 
        <!--<filter class="solr.SnowballPorterFilterFactory" language="Russian" protected="lang/protwords_ru.txt"/>--> 
        <filter class="solr.PorterStemFilterFactory"/> 
      </analyzer> 
    </fieldType> 

Как мы должны изменить нашу схему для поддержки поиска номера? Кроме того, мы не хотим потерять текущие функции поиска

ответ

0

Используйте приведенную ниже схему:

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true"> 
     <analyzer type="index"> 
     <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-FoldToASCII.txt"/> 
     <charFilter class="solr.HTMLStripCharFilterFactory"/> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ru.txt"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <!--<filter class="solr.SnowballPorterFilterFactory" language="Russian" protected="lang/protwords_lt.txt"/>--> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/> 
     <filter class="solr.PorterStemFilterFactory"/> 
     </analyzer> 
     <analyzer type="query"> 
     <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-FoldToASCII.txt"/> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ru.txt"/> 
     <!--<filter class="solr.SynonymFilterFactory" synonyms="lang/synonyms_ru.txt" ignoreCase="true" expand="true"/>--> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <!--<filter class="solr.SnowballPorterFilterFactory" language="Russian" protected="lang/protwords_ru.txt"/>--> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/> 
     <filter class="solr.PorterStemFilterFactory"/> 
     </analyzer> 
</fieldType> 

я использовал WordDelimiterFilterFactory. Он разбил слово на подслово по следующим правилам.

  • разделён на разделители внутри слова (все неаддивидуальные символы). "Wi-Fi" -> "Wi", "Fi"
  • разделение на случай переходов (может быть отключена - см параметр splitOnCaseChange) "PowerShot" -> "Power", "Выстрел"
  • раскол на переключение буквенных чисел (можно отключить - см. параметр splitOnNumerics) «SD500» -> «SD», «500»
  • игнорируются ведущие и конечные разделители между словами по каждому подслову «// hello --- там «чувак» -> «привет», «там», «чувак» trailing «'s» удаляются для каждого подслова (можно отключить - см. параметр stemEnglishPossessive) «O'Neil's» -> «O "," Нейл "
    Примечание: этот шаг не выполняется в отдельном фильтре из-за возможных комбинаций подсловов.

Источник: http://www.pathbreak.com/blog/solr-text-field-types-analyzers-tokenizers-filters-explained

+0

Как это решить вопрос? Они хотят соответствовать подмножеству числовой строки, а не токена, разделенного пробелами, если я правильно понимаю. – MatsLindh

+0

@MatsLindh, я обновил свой ответ, проверьте 3-й пункт. –

+0

Да, это даст три токена для 'VM11110xl',' VM', '11110' и' xl'. Ни один из них не будет соответствовать запросу '111'. Вам также понадобится набросить его, если вы этого хотите. – MatsLindh

1

Основная проблема заключается в том, что вы хотите, чтобы соответствовать подстроке маркеров, поэтому в зависимости от того, что вы хотите реализовать, добавив NGramFilter в цепи может быть решением. Вам нужно будет настроить значения, чтобы получить коэффициент попадания, который вы ищете, так как он также будет соответствовать «110» - в зависимости от того, как вы структурируете данные.

Если вы хотите, чтобы соответствовать началу каждых маркеров, вы можете использовать либо EdgeNgramfilter, или использовать поисковую строку подстановки (field:111*) (но помните, что это может отключить другие части маркеров обработки, так что вы вероятно, лучше с помощью edgengramfilter в этом случае).

В обоих случаях вы хотите добавить ngramfilter при индексировании, а не при запросе.