【问题标题】:Search for partial words using Solr使用 Solr 搜索部分单词
【发布时间】:2011-12-03 14:20:51
【问题描述】:

我正在尝试使用 Solr 搜索部分单词,但无法正常工作。

我在我的 schema.xml 文件中使用它。

<fieldType name="text" class="solr.TextField" omitNorms="false">
  <analyzer type="index">
      <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="15" />
      <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
      <tokenizer class="solr.StandardTokenizerFactory"/>
       <filter class="solr.StandardFilterFactory"/>
       <filter class="solr.LowerCaseFilterFactory"/>
       <filter class="solr.PorterStemFilterFactory"/>
       <filter class="solr.WordDelimiterFilterFactory" stemEnglishPossessive="1" splitOnNumerics="1" splitOnCaseChange="1" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="1" preserveOriginal="1"/>
  </analyzer>
</fieldType>

搜索die h 将不起作用,但die hard 会返回一些结果。 添加上述配置后,我已重新索引数据库。

Here是搜索die hard时的url和输出。调试器已打开。

Here是搜索die h时的url和输出。调试器已打开。

我正在使用 Solr 3.3。 Hereschema.xml 文件的其余部分。

【问题讨论】:

标签: solr sunspot


【解决方案1】:

您共享的查询正在搜索“title_text”字段,但您在上面发布的架构定义了“text”字段。假设这只是一个疏忽,并且 title_text 字段在您的帖子中定义,我认为一个可能的问题是 NGramTokenizer 配置了 minGramSize="3",并且您期望使用单字符令牌进行匹配。

您可以尝试将 minGramSize 更改为 1,但这不可避免地会导致一些非常低效的索引;我想知道你是否真的热衷于让“e”与每部电影的标题中带有 e 相匹配?

【讨论】:

  • 是否可以为所有索引定义NGramTokenizerFactory,而不仅仅是text?我尝试使用Danci 搜索电影The Dancing Masters,它奏效了。但是搜索Danc 没有用,有什么想法吗? NGramTokenizerFactory 限制不应该设置为 3 吗?
  • 分析(标记器等)在 Solr 中按字段定义。如果您想一次索引所有字段中的所有文本,您可以定义一个自动执行此操作的 copyField。我怀疑“Danci”匹配是由于标记化而不是 NGram。如果你在能看到分析结果的管理工具里乱七八糟,你应该能看出来。
  • 使用 copyField 效果很好。 Here 是结果。您是否知道我可能包含在我的 schema.xml 文件中的任何其他上帝过滤器?
  • title_text 不会与问题中定义的 text 类型的 Sunspot 的动态 *_text 匹配吗?所以答案中的第一句话不相关?
  • lulalala 我不知道太阳黑子和这个有什么关系? OP没有提到它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多