gpt4 book ai didi

ruby-on-rails - 搜索#search中的Rails:Elasticsearch::Transport::Transport::Errors::BadRequest

转载 作者:行者123 更新时间:2023-12-03 00:04:29 26 4
gpt4 key购买 nike

我在Rails应用中使用了elasticsearch gem。我正在尝试执行基本搜索,并按与当前位置的距离对结果进行排序。但是尝试搜索时出现以下错误:

[400] {"error":{"root_cause":[{"type":"parse_exception","reason":"illegal latitude value [269.99999983236194] for [GeoDistanceSort] for field [distance_type]."}],"type":"search_phase_execution_exception","reason":"all shards failed","phase":"query","grouped":true,"failed_shards":[{"shard":0,"index":"items","node":"AfyW4Pa4S-qKhua-3lY4rg","reason":{"type":"parse_exception","reason":"illegal latitude value [269.99999983236194] for [GeoDistanceSort] for field [distance_type]."}}]},"status":400}

我使用以下方法创建了 search_controller:
class SearchController < ApplicationController

def show
@items = Item.search(query).records.to_a
end

def search
if params[:q].nil?
@items = []
else
@items = Item.search params[:q]
end
end
end

并且我还在 elasticsearch模型中添加了 mapping indexesitem.rb:
require 'elasticsearch/model'

class Item < ApplicationRecord

include Elasticsearch::Model
include Elasticsearch::Model::Callbacks
include Elasticsearch::Model::Indexing

settings index: { number_of_shards: 1 } do
mappings dynamic: 'false' do
indexes :title, analyzer: 'english', index_options: 'offsets'
indexes :description, analyzer: 'english'
indexes :location, type: 'geo_point'
end
end

def location
[longitude.to_f, latitude.to_f]
end

def current_location
location = request.location
end


def self.search(query)
__elasticsearch__.search(
{
query: {
multi_match: {
query: query,
fields: ['title^10', 'description', 'distance']
}
},
sort: [
{
_geo_distance: {
"pin.location": ["current_location"],
distance: ["radius"],
unit: ["km"],
mode: ["min"],
order: ["asc"],
distance_type: ["arc"],

}
}
],

highlight: {
pre_tags: ['<em>'],
post_tags: ['</em>'],
fields: {
title: {},
description: {},
}
}
}
)
end
end
Item.__elasticsearch__.client.indices.delete index: Item.index_name rescue nil

Item.__elasticsearch__.client.indices.create \
index: Item.index_name,
body: { settings: Item.settings.to_hash, mappings: Item.mappings.to_hash }

Item.import(force: true)

最后,这是我的 View search.html.erb
<%= form_for search_path, method: :get do |f| %>
<p>
<%= f.label "Search for" %>
<%= text_field_tag :q, params[:q] %>
<%= submit_tag "Nearby", name: nil %>
</p>
<% end %>

<ul>
<% @items.each do |item| %>
<li>
<h3>
<%= link_to item.try(:highlight).try(:title) ? item.highlight.title[0].html_safe : item.title,
controller: "search",
action: "show",
id: item._id%>
</h3>
<% if item.try(:highlight).try(:description) %>
<% item.highlight.description.each do |snippet| %>
<p><%= snippet.html_safe %>...</p>
<% end %>
<% end %>
</li>
<% end %>
</ul>

最佳答案

尝试
在Rails Console上
ModelName.reindex

从中筛选出结果的模型。像书

所以
书本索引

关于ruby-on-rails - 搜索#search中的Rails:Elasticsearch::Transport::Transport::Errors::BadRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46081467/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com