Elasticsearch DSL เป็นไลบรารีระดับสูงที่มีจุดมุ่งหมายเพื่อช่วยในการเขียนและเรียกใช้คิวรีกับ Elasticsearch มันถูกสร้างขึ้นบนไคลเอนต์ระดับต่ำอย่างเป็นทางการ (elasticsearch-py)
เป็นวิธีที่สะดวกและเป็นสำนวนมากขึ้นในการเขียนและจัดการคิวรี มันอยู่ใกล้กับ Elasticsearch JSON DSL โดยสะท้อนคำศัพท์และโครงสร้างของมัน มันเปิดเผยช่วงทั้งหมดของ DSL จาก Python โดยตรงโดยใช้คลาสที่กำหนดหรือนิพจน์ที่คล้ายกับชุดแบบสอบถาม
นอกจากนี้ยังมี Wrapper เสริมสำหรับการทำงานกับเอกสารเป็นอ็อบเจ็กต์ Python: การกำหนดการแมป การเรียกค้นและการบันทึกเอกสาร การล้อมข้อมูลเอกสารในคลาสที่ผู้ใช้กำหนด
หากต้องการใช้ Elasticsearch API อื่นๆ (เช่น ความสมบูรณ์ของคลัสเตอร์) เพียงใช้ไคลเอ็นต์พื้นฐาน
pip ติดตั้ง elasticsearch-dsl
โปรดดูไดเร็กทอรีตัวอย่างเพื่อดูตัวอย่างที่ซับซ้อนโดยใช้ elasticsearch-dsl
ไลบรารีเข้ากันได้กับ Elasticsearch เวอร์ชันทั้งหมดตั้งแต่ 2.x
แต่คุณ ต้องใช้เวอร์ชันหลักที่ตรงกัน :
สำหรับ Elasticsearch 8.0 และใหม่กว่า ให้ใช้เวอร์ชันหลัก 8 ( 8.xy
) ของไลบรารี
สำหรับ Elasticsearch 7.0 และใหม่กว่า ให้ใช้เวอร์ชันหลัก 7 ( 7.xy
) ของไลบรารี
สำหรับ Elasticsearch 6.0 และใหม่กว่า ให้ใช้เวอร์ชันหลัก 6 ( 6.xy
) ของไลบรารี
สำหรับ Elasticsearch 5.0 และใหม่กว่า ให้ใช้เวอร์ชันหลัก 5 ( 5.xy
) ของไลบรารี
สำหรับ Elasticsearch 2.0 และใหม่กว่า ให้ใช้เวอร์ชันหลัก 2 ( 2.xy
) ของไลบรารี
วิธีที่แนะนำในการตั้งค่าข้อกำหนดของคุณใน setup.py หรือ Requirements.txt คือ:
# Elasticsearch 8.x elasticsearch-dsl>=8.0.0,<9.0.0 # Elasticsearch 7.x elasticsearch-dsl>=7.0.0,<8.0.0 # Elasticsearch 6.x elasticsearch-dsl>=6.0.0,<7.0.0 # Elasticsearch 5.x elasticsearch-dsl>=5.0.0,<6.0.0 # Elasticsearch 2.x elasticsearch-dsl>=2.0.0,<3.0.0
การพัฒนากำลังเกิดขึ้นบน main
สาขาเก่า ๆ จะได้รับเฉพาะการแก้ไขข้อบกพร่องเท่านั้น
ให้คำขอค้นหาทั่วไปเขียนโดยตรงเป็น dict
:
from elasticsearch import Elasticsearch
client = Elasticsearch ( "https://localhost:9200" )
response = client . search (
index = "my-index" ,
body = {
"query" : {
"bool" : {
"must" : [{ "match" : { "title" : "python" }}],
"must_not" : [{ "match" : { "description" : "beta" }}],
"filter" : [{ "term" : { "category" : "search" }}]
}
},
"aggs" : {
"per_tag" : {
"terms" : { "field" : "tags" },
"aggs" : {
"max_lines" : { "max" : { "field" : "lines" }}
}
}
}
}
)
for hit in response [ 'hits' ][ 'hits' ]:
print ( hit [ '_score' ], hit [ '_source' ][ 'title' ])
for tag in response [ 'aggregations' ][ 'per_tag' ][ 'buckets' ]:
print ( tag [ 'key' ], tag [ 'max_lines' ][ 'value' ])
ปัญหาของวิธีนี้คือใช้รายละเอียดมาก มีแนวโน้มที่จะเกิดข้อผิดพลาดทางไวยากรณ์ เช่น การซ้อนที่ไม่ถูกต้อง แก้ไขได้ยาก (เช่น เพิ่มตัวกรองอื่น) และเขียนไม่สนุกอย่างแน่นอน
มาเขียนตัวอย่างใหม่โดยใช้ Python DSL:
from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search
client = Elasticsearch ( "https://localhost:9200" )
s = Search ( using = client , index = "my-index" )
. filter ( "term" , category = "search" )
. query ( "match" , title = "python" )
. exclude ( "match" , description = "beta" )
s . aggs . bucket ( 'per_tag' , 'terms' , field = 'tags' )
. metric ( 'max_lines' , 'max' , field = 'lines' )
response = s . execute ()
for hit in response :
print ( hit . meta . score , hit . title )
for tag in response . aggregations . per_tag . buckets :
print ( tag . key , tag . max_lines . value )
อย่างที่คุณเห็นห้องสมุดดูแล:
Query
ที่เหมาะสมตามชื่อ (เช่น "match")bool
ผสมterm
ค้นหาในบริบทตัวกรองของแบบสอบถาม bool
เรามาเรียน Python ง่ายๆ แทนบทความในระบบบล็อกกันดีกว่า:
from datetime import datetime
from elasticsearch_dsl import Document , Date , Integer , Keyword , Text , connections
# Define a default Elasticsearch client
connections . create_connection ( hosts = "https://localhost:9200" )
class Article ( Document ):
title = Text ( analyzer = 'snowball' , fields = { 'raw' : Keyword ()})
body = Text ( analyzer = 'snowball' )
tags = Keyword ()
published_from = Date ()
lines = Integer ()
class Index :
name = 'blog'
settings = {
"number_of_shards" : 2 ,
}
def save ( self , ** kwargs ):
self . lines = len ( self . body . split ())
return super ( Article , self ). save ( ** kwargs )
def is_published ( self ):
return datetime . now () > self . published_from
# create the mappings in elasticsearch
Article . init ()
# create and save and article
article = Article ( meta = { 'id' : 42 }, title = 'Hello world!' , tags = [ 'test' ])
article . body = ''' looong text '''
article . published_from = datetime . now ()
article . save ()
article = Article . get ( id = 42 )
print ( article . is_published ())
# Display cluster health
print ( connections . get_connection (). cluster . health ())
ในตัวอย่างนี้ คุณสามารถดู:
.save()
ในตัวเพื่อเชื่อมโยงกับวงจรชีวิตการคงอยู่คุณสามารถดูเพิ่มเติมได้ในบทการคงอยู่ของเอกสารประกอบ
elasticsearch-py
คุณไม่จำเป็นต้องย้ายแอปพลิเคชันทั้งหมดของคุณเพื่อรับประโยชน์ของ Python DSL คุณสามารถเริ่มทีละน้อยได้โดยการสร้างออบเจ็กต์ Search
จาก dict
ที่มีอยู่ แก้ไขโดยใช้ API และทำให้ซีเรียลไลซ์กลับเป็น dict
:
body = {...} # insert complicated query here
# Convert to Search object
s = Search . from_dict ( body )
# Add some filters, aggregations, queries, ...
s . filter ( "term" , tags = "python" )
# Convert back to dict to plug back into existing code
body = s . to_dict ()
เปิดใช้งานสภาพแวดล้อมเสมือน (virtualenvs):
$ virtualenv venv
$ source venv/bin/activate
หากต้องการติดตั้งการขึ้นต่อกันทั้งหมดที่จำเป็นสำหรับการพัฒนา ให้รัน:
$ pip install -e ' .[develop] '
หากต้องการรันการทดสอบทั้งหมดสำหรับ elasticsearch-dsl-py
ให้รัน:
$ python setup.py test
อีกทางหนึ่ง คุณสามารถใช้สคริปต์ run_tests.py
ใน test_elasticsearch_dsl
ซึ่งล้อม pytest เพื่อรันชุดย่อยของชุดทดสอบ ตัวอย่างบางส่วนสามารถดูได้ด้านล่าง:
# Run all of the tests in `test_elasticsearch_dsl/test_analysis.py`
$ ./run_tests.py test_analysis.py
# Run only the `test_analyzer_serializes_as_name` test.
$ ./run_tests.py test_analysis.py::test_analyzer_serializes_as_name
pytest
จะข้ามการทดสอบจาก test_elasticsearch_dsl/test_integration
เว้นแต่จะมีอินสแตนซ์ของ Elasticsearch ที่สามารถเกิดการเชื่อมต่อได้ ตามค่าเริ่มต้น การทดสอบการเชื่อมต่อจะพยายามที่ localhost:9200
ตามค่าเริ่มต้นที่ระบุในคลาสการเชื่อมต่อ elasticsearch-py
เนื่องจากการรันการทดสอบการรวมจะทำให้เกิดการเปลี่ยนแปลงแบบทำลายล้างกับคลัสเตอร์ Elasticsearch ให้รันการทดสอบเฉพาะเมื่อคลัสเตอร์ที่เกี่ยวข้องว่างเปล่าเท่านั้น ด้วยเหตุนี้ หากอินสแตนซ์ Elasticsearch ที่ localhost:9200
ไม่ตรงตามข้อกำหนดเหล่านี้ ก็เป็นไปได้ที่จะระบุเซิร์ฟเวอร์ทดสอบ Elasticsearch อื่นผ่านตัวแปรสภาพแวดล้อม TEST_ES_SERVER
$ TEST_ES_SERVER=my-test-server:9201 ./run_tests
มีเอกสารประกอบอยู่ที่ https://elasticsearch-dsl.readthedocs.io
ต้องการแฮ็ก Elasticsearch DSL หรือไม่? สุดยอด! เรามีคู่มือการบริจาค
ลิขสิทธิ์ 2013 Elasticsearch
ได้รับอนุญาตภายใต้ Apache License เวอร์ชัน 2.0 ("ใบอนุญาต"); คุณไม่สามารถใช้ไฟล์นี้ได้เว้นแต่จะเป็นไปตามใบอนุญาต คุณสามารถขอรับสำเนาใบอนุญาตได้ที่
http://www.apache.org/licenses/LICENSE-2.0
เว้นแต่กฎหมายที่ใช้บังคับกำหนดหรือตกลงเป็นลายลักษณ์อักษร ซอฟต์แวร์ที่เผยแพร่ภายใต้ใบอนุญาตนี้จะถูกแจกจ่าย "ตามที่เป็น" โดยไม่มีการรับประกันหรือเงื่อนไขใดๆ ทั้งโดยชัดแจ้งหรือโดยนัย ดูใบอนุญาตสำหรับภาษาเฉพาะที่ควบคุมการอนุญาตและข้อจำกัดภายใต้ใบอนุญาต