【问题标题】:How to ignore stop words and use remaining words to fetch expected results alone using Solr?如何忽略停用词并使用剩余的词单独使用 Solr 获取预期结果?
【发布时间】:2021-01-13 14:58:12
【问题描述】:

我有一个name 字段,定义如下:

    <fieldType name="lowercase" class="solr.TextField" positionIncrementGap="100">
      <analyzer>
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="true"/>
      </analyzer>
    </fieldType>

我想根据以下条件搜索内容:

示例值:

test a value
test of solr
not a value
test me says value

所以,如果我搜索test value,我应该只得到包含test 和values 的结果。而且,即使我这样做test a value,我仍然应该得到相同的结果,因为停用词将被排除在外。但是,使用当前的设置,即使在 solr 查询中包含 edismax,我也会得到所有结果。它使用这两个令牌中的任何一个来记录。有人可以建议我对定义进行更新以得到预期的结果吗?而且,我是否按预期使用了停用词?我不希望搜索中的停用词消耗执行时间。

我根据建议更新了定义,即使这样,结果对我来说也没有任何意义。

我有一个值what a term。而且,还有其他值,例如 what the term ; about a term; about the term; description test; Name a Nothing 等。搜索 what a term 会返回所有这些。而且,我也只有a 和the 的值。他们也在结果中返回。虽然,对于what a term,根据下面的屏幕截图,查询省略了停用词,结果对我来说没有任何意义。

【问题讨论】:

  • 您可以将索引和查询用作单独的分析器。从查询分析器中删除停止过滤器工厂。
  • 请参考下面的字段类型。
  • 我已经在评论中发布了更新的定义。我仍然看到相同的行为@AbhijitBashetti
  • 你为什么要使用 KeywordTokenizerFactory...?KeywordTokenizerFactory 不会创建文本的标记...它将文本保留为单个标记...在这种情况下,其他过滤器没有用...

标签: search solr stop-words


【解决方案1】:

您可以在搜索和索引期间忽略停用词。您不能在回复中忽略这些词。响应将在文本按原样存储时出现。为搜索和响应存储的数据是不同的。搜索发生在索引数据上。在响应中,您将获得存储的数据。

在您的字段类型定义中,您使用的是KeywordTokenizerFactory。

KeywordTokenizerFactory :用于当您不想创建任何文本标记时。此标记器将整个文本字段视为单个标记。

在此之后使用任何其他过滤器都没有用。

您可以使用StandardTokenizerFactory 代替KeywordTokenizerFactory。 StandardTokenizerFactory :这个标记器将文本字段拆分为标记,将空格和标点符号视为分隔符。

<fieldType name="lowercase" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="true"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="true"/>
      </analyzer>
</fieldType>

在分析页面上,我分析了上述字段的数据。 对数据“test a value”进行索引,用“test value”查询,找到结果。在这里您可以看到在索引数据时跳过了停用词,因为我们应用了stopwordfilterfactory

现在在索引以及分析页面中的查询时使用“测试值”。 它会在应用过滤器并匹配结果时跳过停用词“a”。

【讨论】:

  • 虽然在分析中我看到类似的东西,但搜索结果没有任何意义。有什么想法吗?
  • 我没听懂你...分析有什么问题?
  • 我有一个值什么术语。而且,还有其他值,例如术语 ;关于一个术语;关于术语;描述测试;命名一个 Nothing 等。搜索一个术语会返回所有这些。而且,我也有一个值只是 a 和 the。他们也在结果中返回。虽然,对于一个术语,根据下面的屏幕截图,查询省略了停用词,结果对我来说没有任何意义。
  • 搜索不会在搜索词上发生文本按原样存储......因为在我们要求的架构中......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 2018-10-30
  • 2011-03-11
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多