2013-06-26 4 views
0

У меня есть поле сконфигурировано какSolr Синтаксис запросов точное совпадение

<fieldType name="gtext" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.StandardFilterFactory"/> 
    <!--Needed for efficient trailling wildcard queries--> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="25" side="front"/> 
    <filter class="solr.ReversedWildcardFilterFactory" withOriginal="true" 
     maxPosAsterisk="2" maxPosQuestion="1" minTrailing="2" maxFractionAsterisk="0"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.WordDelimiterFilterFactory" 
      generateWordParts="1" 
      generateNumberParts="1" 
      catenateWords="0" 
      catenateNumbers="1" 
      stemEnglishPossessive="1"    
      catenateAll="0" 
      preserveOriginal="1" 
      /> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.StandardFilterFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.WordDelimiterFilterFactory" 
       generateWordParts="1" 
       generateNumberParts="1" 
       catenateWords="0" 
       catenateNumbers="1" 
       stemEnglishPossessive="1"    
       catenateAll="0" 
       preserveOriginal="1" 
       /> 
    </analyzer> 
</fieldType> 

Так что, когда я ищу, например забавной, он также будет возвращать смешно. Как я могу избежать этого поведения и иметь только забавное соответствие? Это из-за обратных подстановочных знаков?

ответ

2

Это причина EdgeNGramFilterFactory фильтра

<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="25" side="front"/> 

EdgeNGramFilterFactory генерирует край граммы для маркеров, например,

funny будет генерировать ->f, fu, fun, funn, funny .....

Итак, когда вы ищете fun, документы с funny будет соответствовать

ReversedWildcardFilterFactory не вызывает эту проблему, это только усилит поиск префикса запроса.

, например. funny будут сохранены как ynnuf

И префикс запросов *nny будут преобразованы в ynn*, который более подходит для работы.

+0

Уверены ли вы? ngram-фильтр должен сделать трейлинг-групповые запросы более эффективными. Должен ли я избавиться от него? – Windys

+1

вам нужна ngram для подстановочных знаков и почитайте для префиксных запросов. Тем не менее, упомянутые вами проблемы являются причиной ngrams, так как это может привести к частичным совпадениям. Вы можете использовать разные поля с и без ngrams. w/o не приведет к частичным совпадениям. – Jayendra

+0

Спасибо за объяснение !!! – Windys