如何显示从PG-搜索结果multisearch摘录(How to show excerpts fro

2019-07-30 02:06发布

我已经成立了pg_search在我的Rails应用程序在Heroku:

@query = 'fast'
PgSearch.multisearch(@query) #=>
[#<PgSearch::Document searchable: ferrari, :content: 'this car is really fast'>,
 #<PgSearch::Document searchable: viper, :content: 'a very fast car'>]

我想从显示这些结果与摘录content显示在发生匹配。 我可以调用excerpt(content, @query)得到我想要的东西时@query仅一字之差,但excerpt()只能处理精确匹配,因此,如果:

@query = 'car fast'
PgSearch.multisearch(@query) #=>
[#<PgSearch::Document searchable: ferrari, :content: 'this car is really fast'>,
 #<PgSearch::Document searchable: viper, :content: 'a very fast car'>]

然后excerpt(content, @query)是零,因为无处content不完全一样的短语“汽车快”出现。

我认为excerpt(content, @query.split(' ').first)以至少表明的东西多字查询,但仍然有像这样的情况:

@query = 'car?'
@results = PgSearch.multisearch(@query) #=>
[#<PgSearch::Document searchable: ferrari, :content: 'this car is really fast'>,
 #<PgSearch::Document searchable: viper, :content: 'a very fast car'>]
excerpt(@results.first.content, @query) #=> nil

因此,在使用时pg_search如何乡亲显示在搜索结果中摘录?

Answer 1:

FWIW-按照上面nertzy的例子,我能得到这个具有以下工作:

PgSearch.multisearch(@query).select("ts_headline(pg_search_documents.content, plainto_tsquery('english', ''' ' || unaccent('#{@query}') || ' ''' || ':*')) AS excerpt")

我遇到了麻烦plainto_tsquery(?)的工作,因为它是抛出一个语法错误。 以上我的解决办法做的只是结果

PgSearch.multisearch(@query).select(["ts_headline(pg_search_documents.content, plainto_tsquery(?)) AS excerpt", @query]).to_sql

然后在插入to_tsquery参数为新plainto_tsquery呼叫东西,我敢肯定是不完全的声音,但似乎工作。



Answer 2:

我是作者和pg_search的维护者。

现在还没有一个内置的方式来获得摘录沿侧pg_search你的结果,但也有可能很容易,如果我或其他人有建造起来的时间。

PostgreSQL有一个功能ts_headline ,你可以调用,它返回一个字符串摘录为一列。

这或许可以称之为是这样的(我没有测试它尚未):

PgSearch.multisearch(@query).select(["ts_headline(pg_search_documents.content, plainto_tsquery(?)) AS excerpt", @query])

然后,每个结果都应该有一个excerpt返回像你想要的方法。

顺便说一句,这一点是我最终想在pg_search自动。 我只是还没有太深入到它尚未时间。



Answer 3:

如果插值字符串,你会受到SQL注入攻击。

由于.select像不会接受一个参数化的语句.where呢( Users.where("id = ?", params[:id])您将需要显式消毒。

sanitized = ActionController::Base.helpers.sanitize(params[:q])
@results = PgSearch.multisearch(params[:q])
                  .select(["ts_headline(pg_search_documents.content, plainto_tsquery('english', ''' ' || '#{sanitized}' || ' ''' || ':*')) AS excerpt"])


Answer 4:

还有一个更简单的方法,如果你不喜欢通过SQL挖 - 你可以利用内置的pg_search宝石的功能在一个非常简单和直接的方式来显示摘录:

在你的控制器:

@articles = Article.search(params[:search]).with_pg_search_highlight

您认为:

= raw(article.pg_search_highlight)

这应该这样做。



文章来源: How to show excerpts from pg-search multisearch results