首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带轮胎的弹性搜索:多个单词的edgeNgram

带轮胎的弹性搜索:多个单词的edgeNgram
EN

Stack Overflow用户
提问于 2013-01-02 10:08:20
回答 2查看 2.1K关注 0票数 3

假设我有5个电影标题:

  • 无太阳
  • 珊莎
  • 这也是
  • 索尔古德
  • 唯一生还者

我想用以下预期行为实现一个自动完成的搜索字段:

  • " Sans“>Sans Soleil,Sansa
  • "Sans so“> Sans Soleil
  • “所以”>这也是,索尔古德,唯一的幸存者
  • “我也是”>这也是
  • " Sol“>Sol Goode,唯一的幸存者,无太阳

这个用例似乎很明显,而且必须被许多人使用,但我只是无法让它正常工作,我似乎找不到任何答案或文档来帮助它。这是我目前的模式:

代码语言:javascript
运行
复制
class Film < Media
  include Tire::Model::Search
  include Tire::Model::Callbacks

  settings  :analysis => {
              :filter => {
                :title_ngram  => {
                  "type"      => "edgeNGram",
                  "min_gram"  => 2,
                  "max_gram"  => 8,
                  "side"      => "front" }
              },
              :analyzer => {
                :title_analyzer => {
                  "tokenizer"    => "lowercase",
                  "filter"       => ["title_ngram"],
                  "type"         => "custom" }
              }
            } do
    mapping do
      indexes :title, :type => 'string', :analyzer => 'title_analyzer'
      indexes :int_english_title, :type => 'string', :analyzer => 'title_analyzer'
    end
  end
end

以及如何在我的search_controller中处理查询:

代码语言:javascript
运行
复制
search = Tire.search ['books', 'films', 'shows'], :load => true, :page => 1, :per_page => 10 do |s|
    s.query do |query|
        query.string "title:#{params[:search]}"
    end
end
@results = search.results

这会产生一些奇怪的行为:

  • "Sans so“返回"Sansa,Sans Soleil”,这也是“按顺序排列的”。
  • “所以是”返回“索尔古德,无太阳,唯一的幸存者,这也是”按这个顺序。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-03 08:44:58

我认为您可以通过将match查询设置为type:"phrase_prefix"来实现您想要的结果。大多数,但不是全部,你的例子都会奏效。

有了Ngram,您可以更好地控制流程,但他们有相当大的召回(他们通常返回更多的数据,然后你想要),你必须与它斗争。这是使用多个查询术语("Sans so")观察到的“奇怪行为”,因为它们实际上是作为Sans OR so查询执行的。

尝试使用default_operator: "AND"选项(请参阅轮胎的test.rb),或者更确切地说,使用operator: "AND"选项使用match查询(参见轮胎的test.rb)。

有一些关于自动完成、轮胎和Ngram的文章可供选择:

票数 4
EN

Stack Overflow用户

发布于 2013-01-02 10:16:24

试着跟随

代码语言:javascript
运行
复制
search = Tire.search ['books', 'films', 'shows'], :load => true, :page => 1, :per_page => 10 do |s|
      s.query do |q|
        q.boolean do |b|
          b.must {|m| m.string params[:search]} 
        end
      end
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14120127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档