【问题标题】:Hibernate Search + Elasticsearch - remove consecutive duplicate charactersHibernate Search + Elasticsearch - 删除连续重复字符
【发布时间】:2019-11-18 14:20:02
【问题描述】:

我将 Hibernate Search 与 Elasticsearch 结合使用,我需要生成用于搜索的令牌,而无需连续重复字符。我检查了 Elasticsearch 的文档,但找不到任何我需要的东西。我发现了一些关于自定义分析器的东西,但总是使用预定义的标记器和基于我发现的其他部分组合在一起。没有选项可以满足我的需要。

您知道如何实现这一目标吗?

我想到的唯一一件事是创建一个重复的数据库列,并将原始列的重复值删除不需要的字符。然后在这两个字段中进行搜索。

例子:

  • 人名:齐默尔曼
  • 搜索词:齐默尔曼

这个搜索词应该能找到这个人。

PS:不能使用模糊搜索,因为在我的情况下它弊大于利,并找到我不想要的结果。

感谢您的建议。

【问题讨论】:

    标签: java elasticsearch hibernate-search


    【解决方案1】:

    我认为pattern-replace token filter 会起作用。 只需将pattern 参数设置为"(.)\\1+"(“任何字符后跟同一个字符至少一次”)并将replace 参数设置为"$1"(“那个字符,但只有一次”)。

    将这些复制/粘贴到 Java 代码时要小心:反斜杠很重要。

    请注意,我不确定此正则表达式的性能。通常我宁愿使用 ngram 过滤器,但既然你不想要模糊搜索......

    另外请注意,您仍然会得到误报:搜索“Zimmermann”(没有任何拼写错误)在结果列表中返回的名为“Zimmermann”的人可能比实际的“Zimmermann”更高。

    解决或至少缓解此问题的常见解决方案是利用评分。只需按分数(相关性)对结果进行排序,然后精心设计查询,以便精确匹配获得更好的分数。

    例如,您可以为人名添加两个字段:“name_exact”,使用不应用模式替换谓词的分析器,以及“name_fuzzy”,使用不应用模式替换谓词的分析器。 然后在 Hibernate Search 中,构建一个带有两个“should”子句的布尔谓词:每个字段一个。完全匹配自然会得到更高的分数,并且会上升到结果列表的顶部。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-23
      • 2015-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多