“精确”短语与通配符+ SOLR匹配

时间:2015-06-25 13:03:58

标签: ruby-on-rails-4 solr sunspot-rails sunspot-solr

其实我想和' B T Patil'完全匹配。我创建了一个以下的字段类型

<fieldType name="text_name" class="solr.TextField" omitNorms="false">
  <analyzer>
     <tokenizer class="solr.WhitespaceTokenizerFactory"/>
     <filter class="solr.WordDelimiterFilterFactory" preserveOriginal="1" splitOnNumerics="1" splitOnCaseChange="1" catenateWords="1"
      catenateNumbers="1" catenateAll="1" generateWordParts="1" generateNumberParts="1" stemEnglishPossessive="1" />
  </analyzer>
</fieldType>

此外,我的文本字段和ngram文件也应用于字符串。因此,每当我在我的领域中输入B T Patil查询时,它也会返回我无关的结果,即它返回我

 b t Agrawal 
 Jaykumar B. Patil
 BHASKAR B. PATIL

我希望它能归还b t patil or b.t.patil or b. t. patil个结果。 是否需要更改标记器?

1 个答案:

答案 0 :(得分:0)

你可以尝试这样的事情。创建一个完全匹配的字段类型,如下面的

    <fieldType name="text_exact" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>


<dynamicField name="*_exact" stored="false" type="text_exact" multiValued="true" indexed="true"/>

比text和text_name字段提升此字段和短语字段。

searchable do
   text :field1_exact, as: :field1_exact, default_boost: 5.0 do
     field1
   end

   text :field1_name, as: :field1_name, default_boost: 3.0 do
     field1
   end
end

Sunspot.search(Model) do
  fulltext 'B T Patil'do
    fields (field1_exact, field1_name, field1)
    phrase_fields (field1_exact: 8, field1_name: 4, field1: 2)
  end
end

如果有的话,给ngram字段优先级最低。