用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很麻烦,这时候可以考虑使用它。

广告
将在 10 秒后关闭
bannerAds