1

我正在尝试使用轮胎/弹性搜索实现“类似范围”的功能。为什么这不起作用,即使我有状态为“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 ....它应该工作。

谢谢!:)

4

1 回答 1

5

您的问题很可能是由使用该status字段的默认映射引起的,这将对其进行标记——小写、拆分为单词等。

比较这两个:

http://localhost:9200/myindex/_analyze?text=Text1&analyzer=standard

http://localhost:9200/myindex/_analyze?text=Text1&analyzer=keyword

您的解决方案是在映射中使用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

注意:在没有提供索引映射、示例数据等的情况下,几乎不可能提供合理的建议——这种情况是一个例外。

于 2013-04-15T12:26:34.907 回答