繁体   English   中英

如何防止PostgreSQL全文搜索解析器将符号重写为空格?

[英]How to prevent PostgreSQL full text search parser rewriting symbols to spaces?

我的问题是PL / pgSQL解析器将'#'或'+'等符号视为空格符号(可以),因此像'C ++'或'C#'或'PL / SQL'这样的查询被解析为:

 asciiword | Word, all ASCII | C     | {english_stem}        | english_stem | {c}
 blank     | Space symbols   | #     | {thesaurus_en,simple} | simple       | {#}

我正在尝试找到一种处理此类查询的最佳方法。 我一直在尝试通过使用同义词库字典来实现这一点,但是看起来它可能无法工作。

我在想什么是在写入数据库时​​将“ C#”重写为“ CSHARP”的方法(因为我猜“ C#”将被索引为“ C”),并且在搜索时也会执行相同的操作。

我可以在我的Web应用程序端执行此操作,但这似乎并不正确。

我将如何处理该问题,或者可能将哪种PL / pgSQL触发器用于我正在考虑的方法?

好了,您可以编写自己的解析器(用C语言编写),但这可能比您想做的工作还要多。

您可以执行以下操作:

to_tsvector('english', my_transformer(document_text)) 
...
to_tsquery('english', my_transformer(query_text))

您不需要转换实际的文字文档文本,只需转换tsvector索引和查询即可。 您也可以在索引定义中执行此操作(但my_transformer必须是一个不变的函数)。

然后,问题就变成了转换传入文本的最简单/最有效的方法是什么。 如果您已经在使用plperl / pltcl,则可以进行一些巧妙的正则表达式替换。 如果不是这样,请尝试在plpgsql甚至plsql中尝试一些更简单的正则表达式替换。 虽然总会有一些奇怪的情况发生,但是请确保您彻底测试了替代产品。

(代表OP发布。)

为了将来参考,这里有关于创建tsearch解析器的很好的指南: http : //www.sai.msu.su/~megera/postgres/gist/tsearch/V2/docs/HOWTO-parser-tsearch2.html

无论如何,理查德(Richard)建议的解决方案效果很好,所需的工作量也大大减少。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM