我正在尝试使用轮胎/弹性搜索来实现“范围式”功能。为什么这不起作用,即使我的状态为“Test1”或“Test2”的条目?结果总是空的。
collection = @model.search(:page => page, :per_page => per_page) do |s|
s.query {all}
s.filter :terms, :status => ["Test1", "Test2"]
s.sort {by :"#{column}", "#{direction}"}
end
该方法在没有过滤器的情况下工作正常。过滤方法有问题吗?!我已经检查了轮胎doku ....它应该可以工作。
谢谢! :)
答案 0 :(得分:5)
您的问题很可能是由status
字段的默认映射引起的,它会将其标记化 - 小写,分成单词等。
比较这两个:
http://localhost:9200/myindex/_analyze?text=Text1&analyzer=standard
http://localhost:9200/myindex/_analyze?text=Text1&analyzer=keyword
您的案例中的解决方案是在映射中使用keyword
分析器(或将字段设置为not_analyzed
)。当该字段不是“枚举”类型的数据时,您可以使用multi-field功能。
正在运行的Ruby版本如下所示:
require 'tire'
Tire.index('myindex') do
delete
create mappings: {
document: {
properties: {
status: { type: 'string', analyzer: 'keyword' }
}
}
}
store status: 'Test1'
store status: 'Test2'
refresh
end
search = Tire.search 'myindex' do
query do
filtered do
query { all }
filter :terms, status: ['Test1']
end
end
end
puts search.results.to_a.inspect
注意:当没有提供索引映射,示例数据等时,很少有可能 - 这种情况是例外 - 提供合理的建议。