[英]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.