PostgreSQL ts_headline与ts_query正确不匹配

问题描述 投票:0回答:1

运行以下查询时:

select ts_headline(
    $$Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae mauris ac metus pellentesque malesuada. In hac habitasse platea dictumst. Quisque malesuada purus sit amet facilisis aliquam. Pellentesque pharetra erat urna, sit amet tincidunt lectus malesuada vitae. Proin eros metus, fringilla non tortor quis, cursus vulputate felis. Vestibulum laoreet vel urna at blandit. Donec eu enim rutrum, lobortis orci ut, elementum felis. Nunc iaculis ex quis dolor commodo auctor. Suspendisse eleifend tellus nulla, et semper enim varius ut. Donec eu ante pharetra, convallis dui in, vehicula nibh. Nullam quis arcu mattis, suscipit sapien id, ullamcorper urna.$$,
    to_tsquery('Lorem') && phraseto_tsquery('ullamcorper urna'),
    'StartSel=#$#, StopSel=#$#, FragmentDelimiter=$#$, MaxFragments=100, MaxWords=40000, MinWords=5'
);

而不是返回完整的片段,我只收到#$#Lorem#$# ipsum dolor sit amet作为结果。通过阅读规范:

并非在文档中找到所有查询词,然后将显示文档中第一个MinWord的单个片段。

但是,运行以下命令确认tsquery有效:

select
    to_tsvector($$Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae mauris ac metus pellentesque malesuada. In hac habitasse platea dictumst. Quisque malesuada purus sit amet facilisis aliquam. Pellentesque pharetra erat urna, sit amet tincidunt lectus malesuada vitae. Proin eros metus, fringilla non tortor quis, cursus vulputate felis. Vestibulum laoreet vel urna at blandit. Donec eu enim rutrum, lobortis orci ut, elementum felis. Nunc iaculis ex quis dolor commodo auctor. Suspendisse eleifend tellus nulla, et semper enim varius ut. Donec eu ante pharetra, convallis dui in, vehicula nibh. Nullam quis arcu mattis, suscipit sapien id, ullamcorper urna.$$)
 @@ (to_tsquery('Lorem') && phraseto_tsquery('ullamcorper urna'));

为什么ts_headline无法找到该片段?

postgresql full-text-search
1个回答
0
投票
看起来像是首次添加了phraseto_tsquery时引入的错误。我猜想它会找到第一个“ urna”,发现它与“ ullamcorper”不相邻,然后忘记继续搜索更多的“ urna”。

请提交bug report。您可能需要先将示例缩小几倍。

这似乎足够:

select ts_headline( $$Lorem ipsum urna. Nullam nullam ullamcorper urna.$$, to_tsquery('Lorem') && phraseto_tsquery('ullamcorper urna'), 'StartSel=#$#, StopSel=#$#, FragmentDelimiter=$#$, MaxFragments=100, MaxWords=40000, MinWords=5' );

© www.soinside.com 2019 - 2024. All rights reserved.