用JRuby和Sinatra创建独立的搜索引擎
与ohkawa先生上次的文章相比,这次的内容要轻松很多。m(_ _)m
跟那个相比,我花的时间完全不一样。
使用jruby sinatra创建一个独立搜索引擎。
我制作了一个使用JRuby Sinatra将Elasticsearch集成的简易搜索引擎。
注意:这并不实用,只是为了满足我的兴趣。
我对使用Sinatra创建的自制服务器进行了Elasticsearch的集成,并通过简单的REST API实现了搜索功能。
只要正确配置了`config/elasticsearch.yml`文件,当然可以连接到现有的Elasticsearch集群。有些人认为如果要做到这一点,还可以使用Ruby API。
我們的網頁伺服器使用puma,應該可以表現得相當不錯。
暂时运行它
安装Gradle
对于 Mac
$ brew install gradle
开动
$ git clone git@github.com:shinjiikeda/jruby_embedded_elasticsearch.git
$ ./gradlew run
确认elasticsearch已经启动
$ curl -XGET http://localhost:9200/
你可以直接使用elasticsearch的端点。
数据源
数据源会直接使用elasticsearch的API。
从另一个终端。
$ cd example
$ ./import.sh
考试 shì)
$ curl -XGET http://localhost:4567/test/type1?query=test1
{
"took" : 12,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 0.4375,
"hits" : [ {
"_index" : "test",
"_type" : "type1",
"_id" : "1",
"_score" : 0.4375,
"_source":{ "title" : "test1", "description": "a b c d" }
} ]
}
}
说明
目录布局
config/ <- elasticsearch.ymlなどelasticsearchのコンフィグはここ
scripts/ <- ruby scriptはここ
data/ <- elasticsearchのindexはここ
plugins/ <- elasticsearchのpluginはここにいれる
Ruby的REST API源代码
脚本/应用程序.rb / .rb)
# encoding; utf-8
require 'java'
java_import org.elasticsearch.node.NodeBuilder
java_import org.elasticsearch.action.search.SearchResponse
java_import org.elasticsearch.action.search.SearchType
java_import org.elasticsearch.index.query.QueryBuilders
java_import org.elasticsearch.index.query.QueryStringQueryBuilder
require 'sinatra/base'
require 'json'
$node = NodeBuilder.nodeBuilder().node();
$client = $node.client();
class App < Sinatra::Base
configure do
end
get '/:index/:type' do
index = @params['index']
type = @params['type']
query = @params['query']
fields = ! @params['fields'] ? ["_all"] : @params['fields'].split(/,/)
from = @params['from'] ? @params['from'].to_i : 0
size = @params['size'] ? @params['size'].to_i : 10
qsq = QueryBuilders.queryStringQuery(query)
fields.each do | f |
qsq.field(f)
end
qsq.defaultOperator(QueryStringQueryBuilder::Operator::AND)
response = $client.prepareSearch(index)
.setTypes(type)
.setSearchType(SearchType::DFS_QUERY_THEN_FETCH)
.setQuery(qsq)
.setFrom(from).setSize(size)
.execute()
.actionGet()
response.to_s
end
run!
end
由于时间紧迫,我们直接调用了Java API。
你可以随意对这部分进行修改。
输出格式也可以使用haml等进行自定义,非常简单。
当需要替换现有的小规模搜索服务或者需要创建专用API时,可能会发现为了这个目的而分别搭建elasticsearch和API很麻烦,这时候可以考虑使用它。