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}]>}
가장 많은 조회수가 있는 항목별로 정렬됨 첫 번째.