我正在使用 ElasticSearch 和 tire.rb 来索引和搜索我的项目集合。
我想查询索引中的 name 字段。
如果我有一个名称为:Alfa Romeo 的文档,我想通过搜索以下内容找到该文档:
- “阿尔法”
- “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/