【问题标题】:How to do an exact search on field which uses keywordTokenizer and stemming filter如何对使用关键字标记器和词干过滤器的字段进行精确搜索
【发布时间】:2014-11-01 12:22:07
【问题描述】:

我想对一个词干的字段进行完全匹配。例如,我的数据有这个值:-“工作中的保姆”

<fieldType name="string_ci_stem" class="solr.TextField" sortMissingLast="true" omitNorms="true">
        <analyzer type="index">
            <tokenizer class="solr.KeywordTokenizerFactory"/>           
            <filter class="solr.LowerCaseFilterFactory" />
            <filter class="solr.SnowballPorterFilterFactory"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.KeywordTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory" />
            <filter class="solr.SnowballPorterFilterFactory"/>
        </analyzer>

被索引的文档是“babysitters at work”而不是“babysit at work”。我已经看到 solr 仅在使用关键字Tokenizer 时才停止句子的最后一个单词。

有没有办法将“工作中的保姆”索引为“工作中的保姆”,这样:-

“工作中的保姆” - 返回结果 “保姆工作” - 不返回结果。

任何其他有助于实现结果的 schema.xml 定义?

任何帮助将不胜感激。

编辑:更新问题。

【问题讨论】:

  • 很难理解你的问题,但看起来它与停用词有关,与词干无关。
  • @nomoa - 刚刚编辑了问题,我打错了。对困惑感到抱歉。它实际上与停用词无关,因为我没有使用它。
  • 好的,IIRC KeywordTokenizer 使用整个输入发出一个标记,因此“Babysitters at work”将被索引为单个标记“babysitters at work”。您应该使用 StandardAnalyzer 来标记空格和其他内容。看:cwiki.apache.org/confluence/display/solr/Tokenizers

标签: solr lucene solr4 stemming


【解决方案1】:

KeywordTokenizerFactory 不是为您的使用而设计的,因为它会将整个输入编入索引,而不会将输入文本拆分为诸如“Babysitters”“at”“work”之类的标记。 你会得到你想要的 solr.StandardTokenizerFactory 而不是 solr.KeywordTokenizerFactory。更多信息在这里:https://cwiki.apache.org/confluence/display/solr/Tokenizers

然后,如果您想进行单项查询,则必须将发出的令牌连接成一个。我不知道这种过滤器是否在 solr 中可用,但基于此线程创建自己的过滤器应该很容易:http://elasticsearch-users.115913.n3.nabble.com/Is-there-a-concatenation-filter-td3711094.html

  1. 工作中的保姆 -> StandardTokenizer -> "babysitters" "at" "work"
  2. “babysitters” “at” “work” -> 词干提取 -> “babysit” “at” “work”
  3. "babysit" "at" "work" -> 你的串联过滤器 -> "babysit at work"

【讨论】:

  • 如何使用 StandardTokenizerFactory 实现精确的关键字匹配。我相信这将是一个短语匹配。例如。 :- 如果我搜索“工作中的婴儿”,则不应返回诸如“波士顿工作中的婴儿”之类的索引数据。 StandardizedTokenizer 正在返回此类数据。
  • 好吧,我想你不能那样做。最佳匹配是短语搜索。使用 StandardTokenizer,您可以实现最终的连接过滤器,它将在分析结束时将所有标记连接成一个。 elasticsearch-users.115913.n3.nabble.com/…
  • 谢谢 nomoa :) 会试试这个。
猜你喜欢
  • 2017-03-13
  • 1970-01-01
  • 2012-09-05
  • 2018-06-14
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多