โปรเจ็กต์เพื่อความสนุกสนานในการเขียนเครื่องมือค้นหาขนาดเล็กที่ไร้เดียงสาซึ่งเหมาะสำหรับ Small Data™
รันการทดสอบหน่วย:
mix test --exclude external
ดำเนินการทดสอบทั้งหมด รวมถึงการทดสอบที่ต้องอาศัยบริการภายนอก เช่นการทดสอบ RedisIndex
:
mix test
ตรวจสอบให้แน่ใจว่าคุณมี Connection_string ที่ถูกต้องสำหรับ Redis ใน config/config.exs คุณสามารถใช้ docker-compose
เพื่อให้อินสแตนซ์ Redis ทำงานได้อย่างรวดเร็ว
แต่ละดัชนีใน Cedrik จะถูกแสดงโดยกระบวนการที่มี Index
@behaviour
หากต้องการจัดทำดัชนีบางสิ่งลงในดัชนี เพียงโทร Index.index_doc(something, :index_name, type)
โดยที่ something
จะเป็นแผนที่หรือโครงสร้าง Elixir (ฉันอยากจะแนะนำให้สร้างโครงสร้างด้วยฟิลด์ id ที่ใช้โปรโตคอล Storable
- ดูที่ 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 และทำงานอยู่จึงจะสามารถใช้งานได้ ประโยชน์หลักของการใช้ RedisIndex เมื่อเปรียบเทียบกับ AgentIndex คือเมื่อคุณต้องการคงข้อมูลไว้
ในตอนนี้โทเค็นเป็นเพียงสตริงใดๆ ที่คั่นด้วยช่องว่าง
ใช้ Search.search(query_struct, [:index1, :index2])
ดู test/e2e_test.exs
และ test/query_test.exs
หากต้องการรับ query_struct
ที่ Cedrik เข้าใจ จะมี parser แบบง่าย (และไม่สมบูรณ์) สำหรับสตริง: Query.Parse.parse/1
มันจะโทเค็นโทเค็นสตริงแล้วสร้างโครงสร้างการสืบค้น Term และ Wildcard ตามลำดับ ข้อกำหนดและไวด์การ์ดจะถูกรวมไว้ในบูลีนภายในฟิลด์ต้อง
แบบสอบถามนี้จะส่งคืนรหัสเอกสารทั้งหมดในดัชนีที่ระบุ
TermQuery เพียงคืนรหัสเอกสาร (และตำแหน่งของคำในเอกสารนั้น) ที่มีคำที่กำหนด คุณสามารถระบุได้อย่างชัดเจนว่าฟิลด์ใดที่จะดูหรือทั้งหมด (ซึ่งเป็นค่าเริ่มต้น)
ด้วย BooleanQuery คุณสามารถสร้างแบบสอบถามขั้นสูงเพิ่มเติมได้ must
, optional
และ must_not
ข้อความค้นหานี้สามารถช่วยขยาย Hit ของคุณได้ ข้อความค้นหาแบบ Wildcard ที่มีค่า "foo*"
จะตรงกับทั้ง foo และ foobar เป็นต้น โปรดทราบว่าขณะนี้รองรับไวด์การ์ดเดี่ยวเท่านั้น ทั้งนำหน้า ( *foo
) หรือต่อท้าย ( foo*
)
ในขณะนี้ ผลลัพธ์จาก Search.search/2
จะให้รายการสิ่งอันดับที่มีลักษณะดังนี้: {doc_id, #MapSet<[%Location{field: :field, position: x}]>}
จัดเรียงตามสิ่งที่ได้รับความนิยมมากที่สุด อันดับแรก.