我正在将 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/