solr部分搜索字母数字字段不起作用

时间:2014-03-24 12:52:02

标签: search solr lucene

我正在使用solr 4.4.0。我想在其中一个文件上启用部分搜索,即搜索键abc将返回所有文件,其归档值为abc123abc125等。我试图通过{{ 1}}。

我的schema.xml:

EdgeNGramFilterFactory

我的solrconfig.xml:

<fields>
  <field name="variant_sku" type="string" indexed="false" stored="false" required="false" multiValued="false" />
  <field name="parsku" type="text_sku" indexed="true" stored="true" multiValued="false" />
</fields>

<copyField source="variant_sku" dest="parsku"/>
<copyField source="parsku" dest="allText"/>



<fieldType name="text_sku" class="solr.TextField" omitNorms="false">
  <analyzer type = "index">
    <tokenizer class="solr.StandardTokenizerFactory" />
    <filter class="solr.StandardFilterFactory" />
    <filter class="solr.LowerCaseFilterFactory" />
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front" />
  </analyzer>
  <analyzer type = "query">
    <tokenizer class="solr.StandardTokenizerFactory" />
    <filter class="solr.StandardFilterFactory" />
    <filter class="solr.LowerCaseFilterFactory" />
  </analyzer>
</fieldType>

我重新加载并在进行架构更改后进行了完整的数据导入。但部分搜索没有出现。查询<requestHandler name="/query" class="solr.SearchHandler"> <lst name="defaults"> <str name="echoParams">explicit</str> <str name="wt">json</str> <str name="indent">true</str> <str name="df">allText</str> </lst> </requestHandler>

未返回任何结果

编辑:将@__K建议的field_type更改为:

abc

也尝试过:

<fieldType name="text_sku" class="solr.TextField" omitNorms="false">
  <analyzer type = "index">
    <tokenizer class="solr.WhitespaceTokenizerFactory" />
    <filter class="solr.WordDelimiterFilterFactory" catenateAll="1" splitOnNumerics="1" preserveOriginal="1"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front" />
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type = "query">
    <tokenizer class="solr.WhitespaceTokenizerFactory" />
    <filter class="solr.WordDelimiterFilterFactory" catenateAll="1" splitOnNumerics="1" preserveOriginal="1"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front" />
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

但仍面临同样的问题。

EDIT2 :尝试了解决方案here

<fieldType name="text_sku" class="solr.TextField" omitNorms="false">
  <analyzer type = "index">
    <tokenizer class="solr.WhitespaceTokenizerFactory" />
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front" />
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type = "query">
    <tokenizer class="solr.StandardTokenizerFactory" />
    <filter class="solr.WordDelimiterFilterFactory" catenateAll="1" splitOnNumerics="1" preserveOriginal="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

不工作!!

2 个答案:

答案 0 :(得分:2)

将WordDelimiterFilterFactory与splitOnNumerics = 1选项一起使用应该可以正常工作。您不需要NGram过滤器,因为这会对您的索引造成过度杀伤。

所以这应该足够了:

<fieldType name="text_sku" class="solr.TextField" omitNorms="false">
  <analyzer>
    <tokenizer class="solr.WhitespaceTokenizerFactory" />
    <filter class="solr.WordDelimiterFilterFactory" catenateAll="1" splitOnNumerics="1" preserveOriginal="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

很少有事情要注意:

  • 如果更改架构,请重新索引文档。基本上,当您更改索引时间中使用的任何过滤器时。

  • 检查您要搜索的字段。我可以看到你正在设置df到allText,而你正在改变parsku字段的类型。所以我希望这不仅仅是一个错误,所以请确保搜索parsku字段。

如果您也可以发布搜索查询网址,那将会很有帮助。

答案 1 :(得分:1)

此设置适用于我

<fieldType name="text" class="solr.TextField" omitNorms="false">
  <analyzer type = "index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="15" side="front"/>
  </analyzer>
  <analyzer type = "query">
    <tokenizer class="solr.WhitespaceTokenizerFactory" />
    <filter class="solr.WordDelimiterFilterFactory" catenateAll="1" splitOnNumerics="1" preserveOriginal="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>