【问题标题】:How to add facet in Tire (elasticsearch) to has_many association如何将轮胎(elasticsearch)中的构面添加到 has_many 关联
【发布时间】:2012-09-11 20:37:47
【问题描述】:

我想将 facet 添加到 has_many 关联。

我正在从 PostgreSQL 全文搜索迁移到 elasticsearch。

目前我有以下 SQL 查询来进行搜索(PostgreSQL 方式):

rt = "#{Rule.table_name}"
Sentence.
  joins(:rules).joins(:regulations).joins(:speakers).
  where(:authority_name => params[:authority_name], :authority_detail_1 => params[:authority_detail_1]).
  where(:regulations => {:regulation_name => params[:regulation_name]}).
  where("#{rt}.description @@ #{Sentence.sanitize(words)} OR #{rt}.headline @@ #{Sentence.sanitize(words)}")

我查看了关于类似问题的 SO 答案(HABTM 关联)

Facet Troubles with Elasticsearch on Query

并用类似的方法实现代码

-句子增强现实类

class Sentence < ActiveRecord::Base
  # other staff

  include Tire::Model::Search
  include Tire::Model::Callbacks

  mapping do
    indexes :id
    indexes :authority_name, :type => :string, :index => "not_analyzed"
    indexes :authority_detail_1, :type => :string, :index => "not_analyzed"
    indexes :authority_detail_2, :type => :string, :index => "not_analyzed"
    indexes :regulations, :type => :object, :properties => {
      :regulation_name => { :type => :string, :index => "not_analyzed" }
    }
  end

  def to_indexed_json
    to_json(:include => [:rules, :regulations, :speaker])
  end

  def self.search(params)
    tire.search(page: params[:page], per_page: 5, load: true) do
      query do
        boolean do
          must { string params[:query], default_operator: "AND" } if params[:query].present?
          must { term :authority_name, params[:authority_name] } if params[:authority_name].present?
          must { term :authority_detail_1, params[:authority_detail_1] } if params[:authority_detail_1].present?
          must { term :authority_detail_2, params[:authority_detail_2] } if params[:authority_detail_2].present?

          must { terms 'regulations.regulation_name', params[:regulation_name] } if params[:regulation_name].present?
        end
      end
      facet 'authorities' do
        terms :authority_name
        terms :authority_detail_1
        terms :authority_detail_2
      end
      facet 'regulations' do
        terms 'regulations.regulation_name'
      end
      # raise to_curl
    end
  end

  # other staff

end # end of Class

但是这段代码不起作用。

调用 API 后出现错误:

Tire::Search::SearchRequestFailed in SentencesController#search

{

"error": "SearchPhaseExecutionException[Failed to execute phase [query], total failure; shardFailures {[-ocpucv-TwGCmLfPd3U9hQ][sentences][4]: SearchParseException[[sentences][4]: from[-1],size[-1]: Parse Failure [Failed to parse source [{\"query\":{\"bool\":{\"must\":[{\"query_string\":{\"query\":\"appalto\",\"default_operator\":\"AND\"}},{\"terms\":{\"regulations.regulation_name\":\"Cod. civ.\"}}]}},\"facets\":{\"authorities\":{\"terms\":{\"field\":\"authority_detail_2\",\"size\":10,\"all_terms\":false}},\"regulations\":{\"terms\":{\"field\":\"regulations.regulation_name\",\"size\":10,\"all_terms\":false}}},\"size\":5,\"from\":0}]]]; nested: }{[-ocpucv-TwGCmLfPd3U9hQ][sentences][0]: SearchParseException[[sentences][0]: from[-1],size[-1]: Parse Failure [Failed to parse source [{\"query\":{\"bool\":{\"must\":[{\"query_string\":{\"query\":\"appalto\",\"default_operator\":\"AND\"}},{\"terms\":{\"regulations.regulation_name\":\"Cod. civ.\"}}]}},\"facets\":{\"authorities\":{\"terms\":{\"field\":\"authority_detail_2\",\"size\":10,\"all_terms\":false}},\"regulations\":{\"terms\":{\"field\":\"regulations.regulation_name\",\"size\":10,\"all_terms\":false}}},\"size\":5,\"from\":0}]]]; nested: }{[-ocpucv-TwGCmLfPd3U9hQ][sentences][1]: SearchParseException[[sentences][1]: from[-1],size[-1]: Parse Failure [Failed to parse source [{\"query\":{\"bool\":{\"must\":[{\"query_string\":{\"query\":\"appalto\",\"default_operator\":\"AND\"}},{\"terms\":{\"regulations.regulation_name\":\"Cod. civ.\"}}]}},\"facets\":{\"authorities\":{\"terms\":{\"field\":\"authority_detail_2\",\"size\":10,\"all_terms\":false}},\"regulations\":{\"terms\":{\"field\":\"regulations.regulation_name\",\"size\":10,\"all_terms\":false}}},\"size\":5,\"from\":0}]]]; nested: }]",
"status": 500

}

这里的 JSON 错误被解析为更“易读的形式”:

SearchPhaseExecutionException[Failed to execute phase [query], total failure; shardFailures {[-ocpucv-TwGCmLfPd3U9hQ][sentences][4]: SearchParseException[[sentences][4]: from[-1],size[-1]: Parse Failure [Failed to parse source
[{"query":
   {"bool":
     {"must": [
       {"query_string":{"query":"appalto","default_operator":"AND"}},
       {"terms":{"regulations.regulation_name":"Cod. civ."}}
     ]}
   },
    "facets":
     {"authorities":
       {"terms":
         {"field":"authority_detail_2","size":10,"all_terms":false}
       },
      "regulations":
       {"terms":
         {"field":"regulations.regulation_name","size":10,"all_terms":false}
       }
     },
     "size":5,"from":0}]
]];
nested: }{[-ocpucv-TwGCmLfPd3U9hQ][sentences][0]: SearchParseException[[sentences][0]: from[-1],size[-1]: Parse Failure [Failed to parse source [{"query":{"bool":{"must":[{"query_string":{"query":"appalto","default_operator":"AND"}},{"terms":{"regulations.regulation_name":"Cod. civ."}}]}},"facets":{"authorities":{"terms":{"field":"authority_detail_2","size":10,"all_terms":false}},"regulations":{"terms":{"field":"regulations.regulation_name","size":10,"all_terms":false}}},"size":5,"from":0}]]];
nested: }{[-ocpucv-TwGCmLfPd3U9hQ][sentences][1]: SearchParseException[[sentences][1]: from[-1],size[-1]: Parse Failure [Failed to parse source [{"query":{"bool":{"must":[{"query_string":{"query":"appalto","default_operator":"AND"}},{"terms":{"regulations.regulation_name":"Cod. civ."}}]}},"facets":{"authorities":{"terms":{"field":"authority_detail_2","size":10,"all_terms":false}},"regulations":{"terms":{"field":"regulations.regulation_name","size":10,"all_terms":false}}},"size":5,"from":0}]]];
nested: }]

知道如何在轮胎中正确实现 has_many 关联吗?

PS 是的,我在更改轮胎映射后运行了 rake 任务。


编辑:

好的。我通过更改代码中的一行(terms => term)修复了500 错误。

  must { term 'regulations.regulation_name', params[:regulation_name] } if params[:regulation_name].present?

但是现在我的搜索结果是空的?有人知道怎么修这个东西吗? 也许我应该使用其他类型的匹配(我目前使用boolean + must 组合)。

【问题讨论】:

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


    【解决方案1】:

    我有一个错字。当我解决这个问题时,一切正常。

    我会为其他用户发布清晰的代码

    -映射

      mapping do
        indexes :id
        indexes :authority_name, :type => :string, :index => "not_analyzed"
        indexes :authority_detail_1, :type => :string, :index => "not_analyzed"
        indexes :authority_detail_2, :type => :string, :index => "not_analyzed"
    
        indexes :regulations do
          indexes :name, :type => :string, :index => "not_analyzed"
        end
      end
    
      def to_indexed_json
        to_json(:include => [:rules, :regulations, :speaker])
      end
    

    -搜索方法

      def self.search(params)
        empty_params = false
        if params[:query].blank? && params[:authority_name].blank? &&
          params[:authority_detail_1].blank? && params[:authority_detail_2].blank? &&
          params[:regulation_name].blank? && params[:regulation_number].blank? &&
          params[:regulation_year].blank? && params[:regulation_article].blank?
          empty_params = true
        end
    
        unless empty_params
          tire.search(page: params[:page], per_page: 5, load: true) do
            query do
              boolean do
                must { string params[:query], default_operator: "AND" } if params[:query].present?
                must { term :authority_name, params[:authority_name] } if params[:authority_name].present?
                must { term :authority_detail_1, params[:authority_detail_1] } if params[:authority_detail_1].present?
                must { term :authority_detail_2, params[:authority_detail_2] } if params[:authority_detail_2].present?
    
                must { term "regulations.name", params[:regulation_name] } if params[:regulation_name].present?
                must { term "regulations.norm_number", params[:regulation_number] } if params[:regulation_number].present?
                must { term "regulations.year", params[:regulation_year] } if params[:regulation_year].present?
                must { term "regulations.article_number", params[:regulation_article] } if params[:regulation_article].present?
              end
            end
            # raise to_curl
          end
        else
          tire.search(page: params[:page], per_page: 5, load: true) do
            query do
              all
            end
          end
        end
      end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 2013-07-23
      • 2014-10-23
      • 2014-10-24
      • 1970-01-01
      • 2011-11-09
      相关资源
      最近更新 更多