【问题标题】:Using edgeNGram filter in Sunspot在 Sunspot 中使用 edgeNGram 过滤器
【发布时间】:2012-02-13 05:25:40
【问题描述】:

我正在尝试使用 EdgeNGramFilterFactory 来索引名称字段。我尝试模仿 schema.xml

<fieldType name="text_prefix" class="solr.TextField" omitNorms="false">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.ISOLatin1AccentFilterFactory"/>
    <filter class="solr.TrimFilterFactory" />
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="20"  side="front"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.ISOLatin1AccentFilterFactory"/>
    <filter class="solr.TrimFilterFactory" />
  </analyzer>
</fieldType>

...

<field name="text_prefix" stored="false" type="string" multiValued="true" indexed="true"/>

在我的模型中我有:

searchable do
  text :name, :as => :text_prefix

但它似乎没有效果。我错过了什么?

【问题讨论】:

  • 没有效果是什么意思?你在检查什么??你在查询什么??
  • 我想搜索“Ne”并获得“New York”之类的条目。目前它什么都不返回。

标签: ruby-on-rails solr sunspot


【解决方案1】:

您的架构看起来不错,除了一件事:您的 text_prefix 字段的类型为 string 而不是 text_prefix,因此它不使用 EdgeNGramFilterFactory

你应该改变这一行

<field name="text_prefix" stored="false" type="string" multiValued="true" indexed="true"/>

喜欢这个

<field name="text_prefix" stored="false" type="text_prefix" multiValued="true" indexed="true"/>

【讨论】:

  • 感谢它正常工作。但是你知道为什么内置的&lt;field name="text" type="string"` 似乎匹配了 field_type:text 而不是 field_type:string? (就像text 中配置的所有过滤器一样)?
  • @lulalala 很高兴知道它有效。对不起,我没明白你的问题,你能改写一下吗?通常字符串 fieldType 没有被标记等。它只是一个简单的字符串。
  • 别担心,我现在明白了。 Sunspot 说它的默认字段类型是“文本”,但它实际上是一个动态“文本”字段,而不是实际上是一个字符串的静态“文本”类型。
猜你喜欢
  • 2019-02-01
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多