0

在我的 Rails 应用程序中,我使用的是 solr 搜索。子字符串匹配在本地服务器上工作正常,但它匹配我的部署服务器上的完整单词。

可搜索块

searchable do
  text :firstname, :lastname, :login, :mail
  boolean :member
  integer :status
end

schema.xml是。

<fieldType name="text" class="solr.TextField" omitNorms="false">
  <analyzer>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.PorterStemFilterFactory"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="10" side="front" />
  </analyzer>
</fieldType>

我究竟做错了什么?

4

1 回答 1

1

(在此处添加答案以通知您可能的不良行为)

仅供参考,当您对 in 进行更改时"text" fieldTypeschema.xml您正在更改应用程序中每个索引文本字段的配置。有时这是不需要的,因为某些字段需要自定义配置。

例如,假设(无论出于何种原因)您希望以不同于其他文本字段的方式处理名字。假设您想添加名字的同义词。您将首先在您的被叫中创建一个新的fieldTypeschema.xmlfirst_name

<fieldtype name="first_name" class="solr.TextField" positionIncrementGap="100">
  <analyzer>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
  </analyzer>
</fieldtype>

然后在文件fields部分中schema.xml,您将添加两个新的动态字段

<dynamicField name="*_first_name"  stored="false" type="first_name" multiValued="false" indexed="true"/>
<dynamicField name="*_first_names" stored="true"  type="first_name" multiValued="false" indexed="true"/>

注意:dynamicField名称上的“s”表示它是存储类型,为动态字段提供 * 有助于太阳黑子配置

因此,在您的searchable块中,您现在可以执行以下操作:

searchable do
  text :firstname, :as => :user_first_name
  text :lastname, :login, :mail
  boolean :member
  integer :status
end

这现在将使用您的自定义配置"first_name"字段。

如果您希望 first_name 是一个存储值(并且您仍然想使用您的自定义配置),您将实现您的可搜索块,例如:

searchable do
  text :firstname, :stored => true, :as => :user_first_names
  text :lastname, :login, :mail
  boolean :member
  integer :status
end
于 2013-03-28T20:55:02.763 回答