一个有趣的项目,编写一个适合 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}]>}
按点击次数最多的内容排序第一的。