0

我的问题是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 触发器用于我正在考虑的方法?

4

2 回答 2

1

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

您可以执行以下操作:

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

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

那么问题就变成了转换传入文本的最简单/最有效的方法是什么。如果您已经在使用 plperl/pltcl,那么您可能会做一些聪明的正则表达式替换。如果没有,请在 plpgsql 甚至 plsql 中尝试几个更简单的正则表达式替换。不过,这种事情总是有一些棘手的角落案例,因此请确保彻底测试您的替代品。

于 2012-04-21T15:30:02.880 回答
1

(代表 OP 发布。)

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

无论如何,Richard 建议的解决方案工作得很好,并且需要更少的努力。

于 2015-06-16T17:43:04.773 回答