我已经成立了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如何乡亲显示在搜索结果中摘录?
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
呼叫东西,我敢肯定是不完全的声音,但似乎工作。
我是作者和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自动。 我只是还没有太深入到它尚未时间。
如果插值字符串,你会受到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"])
还有一个更简单的方法,如果你不喜欢通过SQL挖 - 你可以利用内置的pg_search宝石的功能在一个非常简单和直接的方式来显示摘录:
在你的控制器:
@articles = Article.search(params[:search]).with_pg_search_highlight
您认为:
= raw(article.pg_search_highlight)
这应该这样做。