java - Hibernate Search + Elasticsearch - 删除连续的重复字符

标签 java elasticsearch hibernate-search

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

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

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

示例:

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

此搜索词应该可以找到此人。

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

感谢您的建议。

最佳答案

我认为pattern-replace token filter会工作。 只需将 pattern 参数设置为 "(.)\\1+"(“任何字符后跟相同字符至少一次”),然后 replace 参数为 "$1"(“该字符,但仅一次”)。

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

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

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

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

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

关于java - Hibernate Search + Elasticsearch - 删除连续的重复字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58916641/

相关文章:

jdbc - ElasticSearch JDBC River创建重复项

elasticsearch - Elasticsearch-搜索小于min_gram的术语

java - Hibernate 搜索带破折号的字符串的精确匹配

java - 使用 validator 针对 xsd 验证soap xml

java - 如何检测会导致 Java 8 中的 ClassCastException 的不明确方法调用?

elasticsearch - 带有聚合的Elasticsearch地理查询

java - Spring引导+ hibernate 搜索: entityManagerFactory dependency error

java - 以下代码会有性能差异吗?

java - 如何将一台计算机上的java应用程序连接到另一台计算机上的数据库

java - 为什么 Hibernate 搜索速度慢?即使记录很少