簡體   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