trabajo-afectivo/lib/search_index_backend.rb

382 lines
7.4 KiB
Ruby
Raw Normal View History

# Copyright (C) 2012-2013 Zammad Foundation, http://zammad-foundation.org/
class SearchIndexBackend
=begin
create/update/delete index
SearchIndexBackend.index(
:action => 'create', # create/update/delete
:data => {
:mappings => {
:Ticket => {
:properties => {
2015-04-06 19:00:16 +00:00
:articles => {
:type => 'nested',
:properties => {
'attachments' => { :type => 'attachment' }
2014-04-28 15:30:06 +00:00
}
}
2014-04-28 15:30:06 +00:00
}
}
}
}
)
SearchIndexBackend.index(
:action => 'delete', # create/update/delete
:name => 'Ticket', # optional
)
SearchIndexBackend.index(
:action => 'delete', # create/update/delete
)
=end
def self.index(data)
url = build_url( data[:name] )
return if !url
if data[:action] && data[:action] == 'delete'
return SearchIndexBackend.remove( data[:name] )
end
2015-05-04 18:58:28 +00:00
Rails.logger.info "# curl -X PUT \"#{url}\" \\"
2015-10-20 08:48:43 +00:00
Rails.logger.debug "-d '#{data[:data].to_json}'"
response = UserAgent.put(
url,
data[:data],
{
json: true,
open_timeout: 5,
read_timeout: 20,
user: Setting.get('es_user'),
password: Setting.get('es_password'),
}
)
2015-05-05 08:26:53 +00:00
Rails.logger.info "# #{response.code}"
return true if response.success?
fail response.inspect
end
=begin
add new object to search index
SearchIndexBackend.add( 'Ticket', some_data_object )
=end
def self.add(type, data)
url = build_url( type, data['id'] )
return if !url
2015-05-04 18:58:28 +00:00
Rails.logger.info "# curl -X POST \"#{url}\" \\"
2015-10-20 08:48:43 +00:00
Rails.logger.debug "-d '#{data.to_json}'"
response = UserAgent.post(
url,
data,
{
json: true,
open_timeout: 5,
read_timeout: 20,
user: Setting.get('es_user'),
password: Setting.get('es_password'),
}
)
Rails.logger.info "# #{response.code}"
return true if response.success?
fail response.inspect
end
=begin
remove whole data from index
SearchIndexBackend.remove( 'Ticket', 123 )
SearchIndexBackend.remove( 'Ticket' )
=end
def self.remove( type, o_id = nil )
url = build_url( type, o_id )
return if !url
2015-05-05 08:26:53 +00:00
Rails.logger.info "# curl -X DELETE \"#{url}\""
response = UserAgent.delete(
url,
{
open_timeout: 5,
read_timeout: 14,
user: Setting.get('es_user'),
password: Setting.get('es_password'),
}
)
2015-10-20 08:48:43 +00:00
Rails.logger.info "# #{response.code}"
return true if response.success?
2015-05-04 18:58:28 +00:00
#Rails.logger.info "NOTICE: can't drop index: " + response.inspect
2015-04-06 19:00:16 +00:00
false
end
=begin
2014-01-29 23:51:55 +00:00
return search result
2014-09-19 21:35:40 +00:00
result = SearchIndexBackend.search( 'search query', limit, ['User', 'Organization'] )
2014-01-29 23:51:55 +00:00
result = SearchIndexBackend.search( 'search query', limit, 'User' )
2014-09-19 21:35:40 +00:00
result = [
{
:id => 123,
:type => 'User',
},
{
:id => 125,
:type => 'User',
},
{
:id => 15,
:type => 'Organization',
}
]
=end
def self.search( query, limit = 10, index = nil, query_extention = {} )
2014-01-29 23:51:55 +00:00
return [] if !query
url = build_url()
return if !url
2014-04-28 15:30:06 +00:00
if index
2014-09-19 21:35:40 +00:00
if index.class == Array
url += "/#{index.join(',')}/_search"
else
url += "/#{index}/_search"
end
2014-01-29 23:51:55 +00:00
else
url += '/_search'
end
data = {}
data['from'] = 0
data['size'] = limit
2014-04-28 15:30:06 +00:00
data['sort'] =
2014-02-02 18:58:31 +00:00
[
{
updated_at: {
order: 'desc'
2014-02-02 18:58:31 +00:00
}
},
'_score'
2014-02-02 18:58:31 +00:00
]
2014-02-02 18:58:31 +00:00
data['query'] = query_extention || {}
if !data['query']['bool']
data['query']['bool'] = {}
end
if !data['query']['bool']['must']
data['query']['bool']['must'] = []
end
2014-01-29 23:51:55 +00:00
# real search condition
2014-02-02 18:58:31 +00:00
condition = {
'query_string' => {
'query' => query
}
}
data['query']['bool']['must'].push condition
2014-01-29 23:51:55 +00:00
2015-05-04 18:58:28 +00:00
Rails.logger.info "# curl -X POST \"#{url}\" \\"
2015-10-20 08:48:43 +00:00
Rails.logger.debug " -d'#{data.to_json}'"
2014-01-29 23:51:55 +00:00
response = UserAgent.get(
url,
data,
{
json: true,
open_timeout: 5,
read_timeout: 14,
user: Setting.get('es_user'),
password: Setting.get('es_password'),
}
)
Rails.logger.info "# #{response.code}"
2014-02-03 18:26:22 +00:00
if !response.success?
2015-05-05 08:26:53 +00:00
Rails.logger.error "ERROR: #{response.inspect}"
return []
2014-02-03 18:26:22 +00:00
end
data = response.data
2014-02-03 18:26:22 +00:00
2014-01-29 23:51:55 +00:00
ids = []
return ids if !data
return ids if !data['hits']
return ids if !data['hits']['hits']
data['hits']['hits'].each { |item|
Rails.logger.info "... #{item['_type']} #{item['_id']}"
2014-09-19 21:35:40 +00:00
data = {
id: item['_id'],
type: item['_type'],
2014-09-19 21:35:40 +00:00
}
ids.push data
2014-01-29 23:51:55 +00:00
}
2014-02-03 18:26:22 +00:00
ids
end
2014-02-02 18:58:31 +00:00
=begin
2015-10-20 08:48:43 +00:00
return aggregation result
result = SearchIndexBackend.aggs(
{
title: 'test',
state_id: 4,
},
['2014-10-19', '2015-10-19', 'created_at', 'month'],
['Ticket'],
)
# year, quarter, month, week, day, hour, minute, second
result = {
hits:{
total:4819,
},
aggregations:{
time_buckets:{
buckets:[
{
key_as_string:"2014-10-01T00:00:00.000Z",
key:1412121600000,
doc_count:420
},
{
key_as_string:"2014-11-01T00:00:00.000Z",
key:1414800000000,
doc_count:561
},
...
]
}
}
}
=end
def self.aggs(query, range, index = nil)
url = build_url()
return if !url
if index
if index.class == Array
url += "/#{index.join(',')}/_search"
else
url += "/#{index}/_search"
end
else
url += '/_search'
end
and_data = []
if query && !query.empty?
bool = {
bool: {
must: {
term: query,
},
},
}
and_data.push bool
end
range_data = {}
range_data[range[2]] = {
from: range[0],
to: range[1],
}
range_data_and = {
range: range_data,
}
and_data.push range_data_and
data = {
query: {
filtered: {
filter: {
and: and_data,
}
}
},
size: 0,
aggs: {
time_buckets: {
date_histogram: {
field: range[2],
interval: range[3],
}
}
}
}
Rails.logger.info "# curl -X POST \"#{url}\" \\"
Rails.logger.debug " -d'#{data.to_json}'"
response = UserAgent.get(
url,
data,
{
json: true,
open_timeout: 5,
read_timeout: 14,
user: Setting.get('es_user'),
password: Setting.get('es_password'),
}
)
Rails.logger.info "# #{response.code}"
if !response.success?
Rails.logger.error "ERROR: #{response.inspect}"
return []
end
Rails.logger.debug response.data.to_json
response.data
end
=begin
2014-04-28 15:30:06 +00:00
return true if backend is configured
2014-02-02 18:58:31 +00:00
result = SearchIndexBackend.enabled?
=end
def self.enabled?
return if !Setting.get('es_url')
return if Setting.get('es_url').empty?
true
end
2014-01-29 23:51:55 +00:00
def self.build_url( type = nil, o_id = nil )
2014-02-02 18:58:31 +00:00
return if !SearchIndexBackend.enabled?
2014-01-28 10:02:31 +00:00
index = Setting.get('es_index').to_s + "_#{Rails.env}"
url = Setting.get('es_url')
2014-01-29 23:51:55 +00:00
if type
if o_id
url = "#{url}/#{index}/#{type}/#{o_id}"
else
url = "#{url}/#{index}/#{type}"
end
else
2014-01-29 23:51:55 +00:00
url = "#{url}/#{index}"
end
url
end
end