Elasticsearch DSL은 Elasticsearch에 대한 쿼리 작성 및 실행을 돕는 것을 목표로 하는 고급 라이브러리입니다. 이는 공식 하위 수준 클라이언트(elasticsearch-py) 위에 구축되었습니다.
쿼리를 작성하고 조작하는 보다 편리하고 관용적인 방법을 제공합니다. 이는 Elasticsearch JSON DSL과 유사하며 해당 용어와 구조를 반영합니다. 정의된 클래스나 쿼리 세트와 같은 표현식을 사용하여 Python에서 DSL의 전체 범위를 직접 노출합니다.
또한 문서를 Python 객체로 작업하기 위한 선택적 래퍼(매핑 정의, 문서 검색 및 저장, 사용자 정의 클래스에서 문서 데이터 래핑)를 제공합니다.
다른 Elasticsearch API(예: 클러스터 상태)를 사용하려면 기본 클라이언트를 사용하면 됩니다.
pip 설치 elasticsearch-dsl
elasticsearch-dsl
사용하는 몇 가지 복잡한 예를 보려면 예제 디렉토리를 참조하세요.
라이브러리는 2.x
이후의 모든 Elasticsearch 버전과 호환되지만 일치하는 주요 버전을 사용해야 합니다 .
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 또는 요구 사항.txt에서 요구 사항을 설정하는 권장 방법은 다음과 같습니다.
# 엘라스틱서치 8.x 탄력적 검색-dsl>=8.0.0,<9.0.0 # 엘라스틱서치 7.x 탄력적 검색-dsl>=7.0.0,<8.0.0 # 엘라스틱서치 6.x 탄력적 검색-dsl>=6.0.0,<7.0.0 # 엘라스틱서치 5.x 탄력적 검색-dsl>=5.0.0,<6.0.0 # 엘라스틱서치 2.x 탄력적 검색-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
개체 만들기(예: "일치")bool
쿼리로 구성bool
쿼리의 필터 컨텍스트에 쿼리 term
넣기블로깅 시스템의 기사를 나타내는 간단한 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의 이점을 얻기 위해 전체 애플리케이션을 포팅할 필요는 없습니다. 기존 dict
에서 Search
객체를 생성하고, 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
또는 pytest를 래핑하는 test_elasticsearch_dsl
의 run_tests.py
스크립트를 사용하여 테스트 모음의 하위 집합을 실행할 수도 있습니다. 아래에서 몇 가지 예를 볼 수 있습니다.
# 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
연결이 발생할 수 있는 Elasticsearch 인스턴스가 없으면 test_elasticsearch_dsl/test_integration
에서 테스트를 건너뜁니다. 기본적으로 테스트 연결은 elasticsearch-py
연결 클래스에 지정된 기본값에 따라 localhost:9200
에서 시도됩니다. 통합 테스트를 실행하면 Elasticsearch 클러스터가 파괴적으로 변경되므로 연결된 클러스터가 비어 있을 때만 실행하십시오. 따라서 localhost:9200
의 Elasticsearch 인스턴스가 이러한 요구 사항을 충족하지 않는 경우 TEST_ES_SERVER
환경 변수를 통해 다른 테스트 Elasticsearch 서버를 지정할 수 있습니다.
$ TEST_ES_SERVER=my-test-server:9201 ./run_tests
설명서는 https://elasticsearch-dsl.readthedocs.io에서 확인할 수 있습니다.
Elasticsearch DSL을 해킹하고 싶으신가요? 엄청난! 기여 가이드가 있습니다.
저작권 2013 엘라스틱서치
Apache 라이센스 버전 2.0("라이센스")에 따라 라이센스가 부여되었습니다. 라이센스를 준수하는 경우를 제외하고는 이 파일을 사용할 수 없습니다. 다음에서 라이센스 사본을 얻을 수 있습니다.
http://www.apache.org/licenses/LICENSE-2.0
해당 법률에서 요구하거나 서면으로 동의하지 않는 한, 라이선스에 따라 배포되는 소프트웨어는 명시적이든 묵시적이든 어떠한 종류의 보증이나 조건 없이 "있는 그대로" 배포됩니다. 라이선스에 따른 허가 및 제한 사항을 관리하는 특정 언어는 라이선스를 참조하세요.