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"}}]}
就先到这里吧.