Small Data™ に適した小さくて単純な検索エンジンを作成するという、遊びのためのプロジェクトです。
単体テストを実行します。
mix test --exclude external
外部サービスに依存するテストを含むすべてのテストを実行します。 RedisIndex
テストなど:
mix test
config/config.exs に redis の正しい connection_string があることを確認してください。 docker-compose
使用すると、redis インスタンスを迅速に起動して実行できます。
Cedrik の各インデックスは、 Index
@behaviour
を持つプロセスによって表されます。何かをインデックスにインデックスするには、単純にIndex.index_doc(something, :index_name, type)
を呼び出します。ここで、 something
Elixir マップまたは構造体になります ( Storable
プロトコルを実装する id フィールドを持つ構造体を作成することをお勧めします - を見てください) lib/document.ex
およびlib/agent_store.ex
(参照用)、 type
既存のインデックス実装AgentIndex
またはRedisIndex
のいずれかである必要があります。 Index.index_doc
の最後の引数はオプションであり、デフォルトはAgentIndex
です。
既存のインデックスのリストを取得するには、 Index.list/0
またはIndex.list/1
を使用します。これらは、 {pid, name, module}
形式のタプルのリストを返します。
これは単純なメモリ内インデックス タイプで、メモリに収まり、永続化する必要のないものに適しています。
これは Redis によってサポートされるインデックスです。これが機能するには、redis インスタンスが稼働している必要があります。 AgentIndex と比較して RedisIndex を使用する主な利点は、データを永続化できることです。
今のところ、トークンはスペースで区切られた単なる文字列です。
Search.search(query_struct, [:index1, :index2])
を使用します。例については、 test/e2e_test.exs
およびtest/query_test.exs
参照してください。
Cedrik が理解できるquery_struct
取得するには、文字列用の単純な (そして不完全な) パーサーQuery.Parse.parse/1
があります。文字列をトークン化し、それに応じて用語とワイルドカードのクエリ構造を構築します。用語とワイルドカードは、必須フィールド内でブール値で囲まれます。
このクエリは、指定されたインデックス内のすべてのドキュメント ID を返します。
TermQuery は、指定された用語を含むドキュメント ID (およびそのドキュメント内の用語の位置) を単純に返します。検索するフィールドを正確に指定することも、すべてのフィールド (デフォルト) を指定することもできます。
BooleanQuery を使用すると、より高度なクエリを作成できます。 must
、 optional
、およびmust_not
このクエリは、ヒットする範囲を広げるのに役立ちます。たとえば、値"foo*"
を持つワイルドカード クエリは、foo と foobar の両方に一致します。現時点では、先頭 ( *foo
) または末尾 ( foo*
) の単一のワイルドカードのみがサポートされていることに注意してください。
現時点では、 Search.search/2
の結果では、次のようなタプルのリストが得られます: {doc_id, #MapSet<[%Location{field: :field, position: x}]>}
最もヒットしたものによって並べ替えられています初め。