我正在尝试通过轮胎/elasticsearch实现“类似作用域”的功能。为什么即使我有状态为“ 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。
谢谢!:)
您的问题很可能是由于对该status字段使用默认映射而引起的,该映射会将其标记化-小写,拆分为单词等。
status
比较这两个:
http://localhost:9200/myindex/_analyze?text=Text1&analyzer=standard http://localhost:9200/myindex/_analyze?text=Text1&analyzer=keyword
您的解决方案是在映射中使用keyword分析器(或将字段设置为not_analyzed)。如果该字段不是“枚举”类型的数据,则可以使用多字段功能。
keyword
not_analyzed
有效的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
注意:在没有提供索引映射,示例数据等的情况下,极不可能(在这种情况下为例外)提供合理的建议。