[elixir! #0033] 在 elixir 项目中使用 riak 数据库(2) 启用 solr 搜索

2017-03-16 20:38

第0篇--RiakKV配置
第1篇--CRDT数据结构

solr

Solr是一个高性能,采用Java5开发,
基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了> 优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。

在 riak 中配置

riakKV 2.0 版本以上内置了 solr, 我们只需要开启搜索功能.

vi /etc/riak/riak.conf

设置

search = on

还需要在 /etc/hosts 文件中添加主机名(与 elixir 项目中的地址相同), 以便 solr 能够访问

192.168.10.83    any_name

启动 riak.

在 elixir 项目中使用

我们首先来尝试一下 counter 类型的搜索方法. 我们需要一个名为 "player" 的 bucket, 其中包含每位 player 的得分 score.

启动上回配置好的 elixir 项目

$ iex -S mix
iex> Riak.Search.Index.put "scores"
:ok

在 riak 中更新 Index:

riak-admin bucket-type update counters '{"props":{"search_index":"scores"}}'

添加新的 counter:

iex> import RiakCounter
RiakCounter
iex> create_counter("people", "Kobe score", 10)
:ok
iex> create_counter("people", "James score", 12)
:ok
iex> change_counter("people", "Kobe score", 5)
:ok

现在, 我们往"people" bucket 中添加了两个 counter, 而我们已经为 counter 这种 bucket-type 添加了索引 scores. 所以, 让我们来编写一些查询代码:

defmodule RiakApp.Search do
  @moduledoc false
  alias Riak.Search

  @doc false
  def search(index, query) do
    {:ok, {_, result, _, num_found}} = Search.query(index, query)
    {num_found, Enum.map(result, &get_value/1)}
  end


  defp get_value({_, data}) do
    bucket = :proplists.get_value("_yz_rb", data)
    type   = :proplists.get_value("_yz_rt", data)
    key    = :proplists.get_value("_yz_rk", data)
    value  = List.last(data)
    
    %{bucket: bucket, type: type, key: key, value: value}
  end
end

试着运行一下:

iex> import RiakApp.Search                       
RiakApp.Search
iex> search("scores", "counter:[* TO 15]")
{2,
 [%{bucket: "people", key: "James score", type: "counters",
    value: {"counter", "12"}},
  %{bucket: "people", key: "Kobe score", type: "counters",
    value: {"counter", "15"}}]}

就先到这里吧.