一個有趣的項目,編寫一個適合 Small Data™ 的小型、簡單的搜尋引擎。
運行單元測試:
mix test --exclude external
執行所有測試,包括依賴外部服務的測試。例如RedisIndex
測試:
mix test
確保 config/config.exs 中的 redis 連接字串正確。您可以使用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}]>}
按點擊次數最多的內容排序第一的。