我正在编写一个全文搜索功能的原型,它将在搜索结果中返回找到的文档的“标题”.这是
Postgres docs的一个略微修改的例子:
SELECT ts_headline('english','The most common type of search is to find all documents containing given query terms <b>and</b> return them in <order> of their similarity to the query.',to_tsquery('query & similarity'),'StartSel = XXX,StopSel = YYY');
我期望的是什么样的
"documents containing given XXXqueryYYY terms <b>and</b> return them in <order> of their XXXsimilarityYYY to the XXXqueryYYY."
我得到的是
"documents containing given XXXqueryYYY terms and return them in of their XXXsimilarityYYY to the XXXqueryYYY."
看起来像HTML标签一样远程看起来的所有内容都被剥离并替换为单个空格字符(请注意和之间的双重空格).
我没有在文档中找到任何声明Postgres假设输入文本是HTML并且用户希望剥离标签的地方. api允许从默认的< b>覆盖StartSel和StopSel.和< / b>,所以我认为这是为了提供更一般的用例.
在我缺少的文档中是否有一些设置或注释?
< b取代;和< / b>被识别为标记令牌.默认情况下他们是
忽略.您需要修改现有配置或创建新配置:
忽略.您需要修改现有配置或创建新配置:
=# CREATE TEXT SEARCH CONfigURATION english_tag (copY = english); =# alter text search configuration english_tag add mapping for tag with simple;
然后不跳过标签:
=# select * from ts_debug('english_tag','query <b>test</b>'); alias | description | token | dictionaries | dictionary | lexemes -----------+-----------------+-------+----------------+--------------+--------- asciiword | Word,all ASCII | query | {english_stem} | english_stem | {queri} blank | Space symbols | | {} | (null) | (null) tag | XML tag | <b> | {simple} | simple | {<b>} asciiword | Word,all ASCII | test | {english_stem} | english_stem | {test} tag | XML tag | </b> | {simple} | simple | {</b>}
但即使在这种情况下,ts_headline也会跳过标签.因为它是
hardcoded:
#define HLIDREPLACE(x) ( (x)==TAG_T )
当然有一种解决方法.可以创建自己的文本搜索解析器扩展. GitHub的例子.并改变
#define HLIDREPLACE(x) ( (x)==TAG_T )
至
#define HLIDREPLACE(x) ( false )
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。