TSearch2 - 点爆炸

时间:2011-05-11 10:27:09

标签: sql postgresql full-text-search

转化后

SELECT to_tsvector('english', 'Google.com');

返回:

'google.com':1

为什么TSearch2引擎没有返回这样的内容?

'google':2, 'com':1

或者我如何让引擎返回我上面写的爆炸字符串? 我只需要通过“谷歌”找到“Google.com”。

2 个答案:

答案 0 :(得分:1)

首先,如果你不知道,不推荐使用tsearch2来支持内置功能:

http://www.postgresql.org/docs/9/static/textsearch.html

至于您的实际问题,google.com会被解析器识别为主机:

http://www.postgresql.org/docs/9.0/static/textsearch-parsers.html

如果您不希望发生这种情况,则需要相应地预处理文本(或使用自定义解析器)。

答案 1 :(得分:1)

不幸的是,没有快速简便的解决方案。

Denis是正确的,因为解析器将其识别为主机名,这就是为什么它不会将其分解。

还有其他3件事你可以做,我的头脑。

  1. 您可以在数据库中禁用主机解析。有关详细信息,请参阅postgres documentation。例如。像ALTER TEXT SEARCH CONFIGURATION your_parser_config DROP MAPPING FOR url, url_path

  2. 之类的东西
  3. 您可以编写自己的自定义词典。

  4. 您可以在以某种方式将数据插入数据库之前对其进行预解析(可能在进入数据库之前拆分所有域)。


  5. 去年我遇到了类似的问题,并选择了上面的解决方案(2)。

    我的解决方案是编写一个自定义词典,将单词分解为非单词字符。自定义词典更容易和更容易写入比新解析器更快。你仍然要写C tho :)

    我写的字典会为{www.facebook.com'域返回'www.facebook.com':4, 'com':3, 'facebook':2, 'www':1'之类的内容(我们有一个独特的场景,因此4个结果而不是3个)。

    自定义词典的问题在于您将不再受到干扰(即:www.books.com将以www,books和com形式出现)。我相信有一些工作(可能已经完成)允许链接字典来解决这个问题。