【问题标题】:How to prefix match a doc value -> search term in lucene search engines like Solr, ElasticSearch如何在 Solr、ElasticSearch 等 Lucene 搜索引擎中前缀匹配文档值 -> 搜索词
【发布时间】:2023-01-30 17:21:24
【问题描述】:

我们需要来自<document value> -> <search term> 的前缀匹配。在 Solr 中可以反向,ElasticSearch 是 <search term> -> <document value>

例子:

Search term -> "traveling the world"
Document field value -> "travel"

不确定如何前缀匹配或模糊此查询,以便我们可以获得此文档结果。

前缀匹配就像这样"travel*"

搜索词 -> "travel"

文档字段值 -> "traveling the world"

【问题讨论】:

  • 尝试使用词干过滤器工厂...

标签: elasticsearch solr


【解决方案1】:

尝试在您的字段定义中使用 PorterStemFilterFactory。

<filter class="solr.PorterStemFilterFactory"/>

您的定义可能如下所示:

<analyzer type="index">
  <tokenizer class="solr.StandardTokenizerFactory "/>
  <filter class="solr.PorterStemFilterFactory"/>
</analyzer>

这是输入和输出:

在:“跳跳跳”

要过滤的分词器:“跳”,“跳”,“跳”

出去:“跳”,“跳”,“跳”

还有另一种替代方法,称为 solr.KStemFilterFactory,它的攻击性较低。

我的意思是简而言之,您可以为您的字段定义字段类型,如下所示。

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

通过为您的字段定义,可以决定在索引时如何存储文本以及在查询时要查询的文本。

分词器和过滤器根据您的字段定义改变您的原始文本。

例如,如果您对“Travelling”这个词进行索引,它会被索引为“travel”,因此当您使用“travel”这个词进行搜索时,它将匹配并且您会在结果中获得记录。

反之亦然。就像如果您将文本索引为“旅行”,那么它将根据字段定义被索引为“旅行”。在这里,如果您搜索的文本是“Travelling”,那么根据字段定义,它会被搜索为“travel”。因此找到匹配项。

要学习并更好地理解此分析,请查看 solr 分析页面。

在上面的示例中,In、Out 是字段输入的示例,根据应用于字段的字段类型,您将获得输出。

【讨论】:

  • 谢谢,但你能指出它在这个例子中有什么帮助吗?说“旅行”在 solr 文档中,当用户搜索词是“环游世界”时,我需要前缀类型搜索。也不确定这个 In 和 Out 是什么意思。是不是当输入字段有“jump jumping jumped”时,porter stemmer 会索引“jump”出现 3 次?有没有办法在英语单词上使用波特词干逻辑?像“旅行”->“旅行”已经被处理了吗?
  • @RagingBull,我已经用更多细节修改了答案。我希望它能解决你所有的问题。
猜你喜欢
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
  • 1970-01-01
  • 1970-01-01
  • 2011-06-06
  • 2012-11-03
  • 2020-10-06
相关资源
最近更新 更多