首页 > 解决方案 > 为什么 Web 应用程序的 Solr 搜索引擎在搜索“Spring Fertility”时会返回“Java Spring”结果?如何解决这个问题?

问题描述

实际上,我们现在没有用于此 Web 应用程序的 Solr 或 Lucene 引擎。我们注意到在 Web 应用程序中存在这两个问题。应该如何解决这个问题?

1) 当用户使用“Java Spring”这个词搜索时,显示的结果包括“春天生育”等?我想现在运行在网络应用程序后面的搜索引擎会进行基于文本/语义的搜索。如何启用基于上下文的搜索(我提出了术语基于上下文的搜索,不确定是否存在),当用户搜索技术术语“java Spring”时,它不包括“spring season”之类的结果或“铁弹簧”。

2)我注意到第二个问题是,如果我们搜索“TeslaLLC”,则不会返回任何结果。但是,如果我们将搜索词修改为“Tesla LLC”(带有空格),它会返回值。应该如何解决这个问题?(看起来他们输入系统的值是“Tesla LLC”(带空格)。但是用户可以输入带或不带空格的内容,在我看来,搜索引擎应该同时处理这两者。

我们知道使用的技术是 Solr 和 Lucene。因此,如果您可以根据该技术提供建议,那将很有帮助。

标签: javasearchsolrlucenefull-text-search

解决方案


这完全取决于您如何索引字段。字段使用什么字段类型。字段类型在索引时和查询等是否有不同的分析器。字段类型由标记器、过滤器等组成或构建。

有许多标记器和过滤器可用于构建自定义字段类型。schema.xml 文件中提供了一些默认字段类型。您可以将这些应用到您的字段并在查询时和索引时检查数据的索引方式(令牌的创建方式)。

这可以在 solr 管理页面的帮助下检查或分析。

自定义字段类型的示例。

<fieldType name="Custom_text" class="solr.TextField">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

输入到 solr 字段:"Please, email john.doe@foo.com by 03-09, re: m37-xq."

solr 字段的输出:"please", "email", "john.doe", "foo.com", "by", "03", "09", "re", "m37", "xq"

现在回到你的问题。

  1. 看起来你想要完全匹配。您可以为您的字段使用字符串类型而不是文本。如果您使用文本,那么您使用关键字标记器,它不会为您的文本创建任何标记。它将按原样存储/索引。因此,您将获得完全匹配。

  2. 在这种情况下,应用的字段类型可能在 solr 中创建了诸如“Tesla LLC”或“Tesla”、“LLC”之类的标记。在这里,这一切都取决于用于相同字段类型的标记器和过滤器。所以它不会匹配你的字符串 ""TeslaLLC"" 因为 solr 没有找到相同字符串的标记。

solr 可以做很多事情。但是您只需要在索引时和查询时了解字段、字段类型、标记器、过滤器、分析器(您可以在查询和索引时保持相同的分析器或不同的分析器,取决于您的要求)

标记器、过滤器的链接


推荐阅读