ruby-on-rails - 如何在 elasticsearch 的同一字段上使用多个查询进行搜索?

标签 ruby-on-rails ruby-on-rails-3 elasticsearch tire

我正在使用 ElasticSearch 和 tire.rb 来索引和搜索我的项目集合。

我想查询索引中的 name 字段。

如果我有一个名称为:Alfa Romeo 的文档,我想通过搜索以下内容找到该文档:

  1. “阿尔法”
  2. “Alfa Remeo”(注意拼写错误)

在 ElasticSearch 和 tire 中,我知道如何分别设置这两个查询:

使用通配符搜索:

Model.tire.search do
  query do
    boolean do
      must { string "#{myquerystring}*", default_field: 'name' }
    end
  end
end

模糊搜索(编辑距离):

Model.tire.search do
  query do
    boolean do
      must { text :name, { query: mysquerystring, operator: 'AND', fuzziness: 0.4 } }
    end
  end
end

如何结合(with or)?

我想做的是找到通配符或模糊搜索匹配的所有文档。我可以做两个单独的搜索并尝试将它们组合起来,但这没有多大意义。我能以某种合乎逻辑的方式做到这一点吗?

最佳答案

按照 David 的建议,您可以使用 bool query使用 minimum_number_should_match

但这里有一些关于查询字符串中通配符的想法。

在你的例子中,一个 prefix query优于 query string :

  • 查询字符串中的通配符比前缀查询慢
  • 您正在用户提供的查询末尾手动添加 * - 明确表示您要使用前缀查询(专为此而设计)

在 Tire 中,这是一个完整的示例:

require 'tire'


class Car
  include Tire::Model::Persistence

  property :name, type: "multi_field",
                    fields: {
                      name:  { type: 'string', analyzer: 'snowball'  },
                      exact: { type: 'string', index:    'not_analyzed' }
                    }

end

Car.index.delete
Car.create_elasticsearch_index

Car.create name: 'Alfa'
Car.create name: 'Alfa Romeo'
Car.index.refresh

queries = [ 'Alfa', 'Alf', 'Alfa Remeo', 'Remeo' ] # Notice the spelling mistake

puts "Searching for: #{queries.join(', ')}", "="*80, ""

queries.each do |q|

  s = Car.search do
    query do
      boolean minimum_number_should_match: 1 do
        should { prefix 'name', q  }
        should { prefix 'name.exact', q, boost: 10 }
        should { match :name, q, operator: 'AND', fuzziness: 0.4 }
      end
    end
  end

  puts "Found #{s.results.size} results for query '#{q}':",
      "-"*80,
       s.map { |d| "#{d.name} (score: #{d._score})" }.join(", "),
       ""
end

结果:

Searching for: Alfa, Alf, Alfa Remeo, Remeo
================================================================================

Found 2 results for query 'Alfa':
--------------------------------------------------------------------------------
Alfa (score: 0.67262733), Alfa Romeo (score: 0.67027444)

Found 2 results for query 'Alf':
--------------------------------------------------------------------------------
Alfa (score: 0.6693944), Alfa Romeo (score: 0.66834825)

Found 1 results for query 'Alfa Remeo':
--------------------------------------------------------------------------------
Alfa Romeo (score: 0.08865173)

Found 1 results for query 'Remeo':
--------------------------------------------------------------------------------
Alfa Romeo (score: 0.06392767)

关于ruby-on-rails - 如何在 elasticsearch 的同一字段上使用多个查询进行搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12519661/

相关文章:

ruby-on-rails - RSpec 生成请求规范而不是 Controller 规范

elasticsearch - 如何在 Laravel 中实现 Elastic Search 自动完成

lucene - Elasticsearch/Lucene亮点

spring-boot - Elasticsearch Spring boot findAll Result窗口太大,from + size必须小于或等于:[10000]但为[331576]

ruby-on-rails - Rails 中的后台处理

ruby-on-rails - Rails 5.1.0 如何升级

jquery - 使用 Ruby on Rails 的范围 slider

ruby-on-rails - Spork 不会重新加载代码

ruby-on-rails - 如何知道rails中包含什么配置

ruby-on-rails - 如何使用回形针将图像保存到各自的ID?