Elasticsearch 클라이언트 사용

전문 검색 엔진 Elasticsearch 입문 강좌


전체 텍스트 검색은 가장 흔히 볼 수 있는 수요에 속한다. 소스 Elasticsearch(이하 Elastic)는 현재 전체 텍스트 검색 엔진의 첫 번째 선택이다.
그것은 대량의 데이터를 신속하게 저장하고 검색하며 분석할 수 있다.위키백과, Stack Overflow, Github는 모두 그것을 채택한다.
Elastic의 밑바닥은 개원 라이브러리 Lucene입니다.하지만 Lucene을 직접 사용할 수는 없습니다. 인터페이스를 호출하려면 코드를 직접 써야 합니다.Elastic은 Lucene의 패키지로 REST API의 조작 인터페이스를 제공하여 상자를 열면 바로 사용할 수 있다.
본고는 0부터 시작하여 Elastic를 사용하여 자신의 전문 검색 엔진을 구축하는 방법을 설명한다.한 걸음 한 걸음 상세한 설명이 있으니 모두 따라 하면 배울 수 있다.

1. 설치


Elastic에는 Java 8 환경이 필요합니다.만약 당신의 기계가 아직 Java를 설치하지 않았다면 이 글을 참고하시기 바랍니다. 환경 변수 JAVA_HOME이 올바르게 설정되었습니다.
Java를 설치하면 공식 문서에 따라 Elastic을 설치할 수 있습니다.압축 패키지를 직접 다운로드하는 것은 비교적 간단하다.
홈페이지에서 윈도우 버전의 Elastic을 다운로드하여 bin 디렉터리에서 직접 Elasticsearch를 실행합니다.bat 파일
모든 것이 정상적이면 Elastic은 기본 9200 포트에서 실행됩니다.이 때 다른 명령줄 창을 열고 포트를 요청하면 설명 정보를 얻을 수 있습니다.
localhost:9200

 :

{

"name": "KFEf6L-",

"cluster_name": "elasticsearch",

"cluster_uuid": "V_vmr0HRQkaqZuJDsvrFlQ",

"version": {

"number": "6.2.3",

"build_hash": "c59ff00",

"build_date": "2018-03-13T10:06:29.741383Z",

"build_snapshot": false,

"lucene_version": "7.2.1",

"minimum_wire_compatibility_version": "5.6.0",

"minimum_index_compatibility_version": "5.0.0"

},

"tagline": "You Know, for Search"

}

위 코드에서 9200 포트를 요청하면 Elastic은 현재 노드, 집단, 버전 등 정보를 포함하는 JSON 대상을 되돌려줍니다.
기본적으로 Elastic은 본 컴퓨터에서만 접근할 수 있습니다. 원격 접근이 필요하면 Elastic 설치 디렉터리의config/elasticsearch를 수정할 수 있습니다.yml 파일, 네트워크 제거.host의 주석입니다. 값을 0.0.0.0으로 바꾸고 Elastic를 다시 시작합니다.
network.host: 0.0.0.0

위 코드는 누구나 접근할 수 있도록 0.0.0.0으로 설정되어 있습니다.온라인 서비스는 이렇게 설정하지 말고 구체적인 IP로 설정해야 한다.
Elastic은 Restful 형식의 웹 요청 조작을 제공합니다. 여기에는 POSTMAN을 사용하여 관련 요청을 수행합니다.

2. 기본 개념


2.1 Node 및 Cluster


Elastic는 본질적으로 분포식 데이터베이스로 여러 대의 서버가 협동하여 작업할 수 있고 각 서버는 여러 개의 Elastic 실례를 실행할 수 있다.
하나의 Elastic 인스턴스를 하나의 노드(node)라고 합니다.하나의 노드가 하나의 집단 (cluster) 을 구성한다.

2.2 Index


Elastic은 모든 필드를 인덱스하고 처리된 후 인버터 색인(Inverted Index)을 기록합니다.데이터를 찾을 때 이 인덱스를 직접 찾습니다.
따라서 Elastic 데이터 관리의 최상위 단위를 Index(인덱스)라고 합니다.그것은 단일 데이터베이스의 동의어이다.각 Index(데이터베이스)의 이름은 소문자여야 합니다.
다음 명령은 현재 노드의 모든 Index를 볼 수 있습니다.
GET http://localhost:9200/_cat/indices?v
 
_cat 파라미터는 집단의 관련 정보를 볼 수 있도록 합니다. 예를 들어 다음과 같습니다.
?V 매개변수는 세부 정보 표시 의미를 나타냅니다.
 
건강 상태 인덱스 고유 식별
health status index uuid pri rep
yellow open accouts BivVDg_6RjGrVhXLnrLcnA 5 1
 
문서 레코드 수 문서 삭제 개 수 저장소 크기
docs.count docs.deleted store.size pri.store.size
3 0 11kb 11kb
보기_cat에서 볼 수 있는 정보
통과 명령: GET localhost: 9200/_cat/나열 가능_cat 매개 변수가 볼 수 있는 내용
 

2.3 Document


Index의 단일 레코드를 Document(문서)라고 합니다.여러 개의 Document가 Index를 구성합니다.
Document는 JSON 형식으로 다음 예제를 나타냅니다.
{"user": "장삼", "title": "엔지니어", "desc": "데이터베이스 관리"}
같은 Index에 있는 Document는 같은 구조(scheme)를 요구하지 않지만 같은 구조를 유지하는 것이 검색 효율을 높이는 데 도움이 됩니다.
2.4 Type
Document는 그룹을 나눌 수 있습니다. 예를 들어 weather라는 인덱스에서 도시(베이징과 상하이), 기후(맑은 날과 비 오는 날)에 따라 그룹을 나눌 수 있습니다.이 그룹을 Type이라고 합니다. 이 그룹은 가상 논리 그룹으로 Document를 필터링하는 데 사용됩니다.
서로 다른 유형은 비슷한 구조(schema)가 있어야 한다. 예를 들어 id 필드는 이 그룹에서 문자열일 수 없고 다른 그룹에서 수치일 수 없다.이것은 관계형 데이터베이스의 표와 구별된다.성질이 완전히 다른 데이터 (예를 들어 제품과logs) 는 하나의 인덱스 안의 두 가지 유형 (할 수 있지만) 이 아니라 두 개의 인덱스로 저장해야 한다.
다음 명령은 각 Index에 포함된 Type을 나열합니다.
GET 'localhost:9200/_mapping?pretty=true'
계획에 따르면 Elastic 6.x 버전에서는 각 Index에 하나의 Type만 포함할 수 있습니다. 7.x 버전은 Type을 완전히 제거합니다.

3. Index 새로 만들기 및 제거


새 Index는 Elastic 서버에 직접 PUT 요청을 보낼 수 있습니다.다음 예는 weather라는 Index를 새로 만드는 것입니다.
PUT 'localhost:9200/weather'
서버가 JSON 대상을 되돌려줍니다. acknowledged 필드는 작업이 성공했음을 나타냅니다.
{ "acknowledged":true, "shards_acknowledged":true }
그런 다음 DELETE 요청을 보내서 이 Index를 삭제합니다.
 
DELETE 'localhost:9200/weather'

4. Index 만들기


PUT localhost: 9200/accounts {"mappings": {"person": {"user": {"type": "text"//"analyzer": "ik_max_word", 기본 분사기 사용을 지정하지 않음///search_analyzer":"ik_max_word"//검색은 기본 분사기를 지정합니다},"title": {"type":"text"},"desc": {"type": text"}}}}}"
위 코드에서 먼저 계정이라는 Index를 새로 만듭니다. 그 안에 개인이라는 Type이 있습니다.person에는 세 개의 필드가 있습니다.
  • user
  • title
  • desc

  • 5. 데이터 조작


    5.1 신규 기록


    지정한/Index/Type에 PUT 요청을 보내면 Index에 레코드를 추가할 수 있습니다.예를 들어/accounts/person에 요청을 보내면 인원 기록을 추가할 수 있습니다.
    PUT localhost:9200/accounts/person/1 
    { "user": " ", "title": " ", "desc": " " }'

    자세히 보면 요청 경로가/accounts/person/1이고 마지막 1은 이 기록된 Id입니다.그것은 반드시 숫자가 아니라 임의의 문자열 (예를 들어 abc) 도 가능하다.
    기록을 추가할 때 Id를 지정하지 않을 수도 있습니다. 이때 POST 요청으로 변경해야 합니다.
    
    POST 'localhost:9200/accounts/person' -d ' 
    { "user": " ", "title": " ", "desc": " " }'

    위 코드에서/accounts/person에 POST 요청을 보내고 기록을 추가합니다.서버가 반환하는 JSON 객체에서,_id 필드는 무작위 문자열입니다.
    { "_index":"accounts", "_type":"person", "_id":"AV3qGfrC6jMbsbXb6k1p", "_version":1,
     "result":"created", "_shards":{"total":2,"successful":1,"failed":0}, "created":true }

    인덱스를 먼저 만들지 않으면 (이 예는 accounts) 위의 명령을 직접 실행하면 Elastic도 오류를 보고하지 않고 지정한 인덱스를 직접 생성합니다.따라서 인덱스 이름을 잘못 쓰지 않도록 타자를 칠 때 조심해야 한다.

    5.2 레코드 보기


    이 레코드를 보려면/Index/Type/Id에 GET 요청을 보내십시오.
    $ curl 'localhost:9200/accounts/person/1?pretty=true'

    위 코드는/accounts/person/1 이 기록을 보기를 요청합니다. URL의 매개 변수pretty=true는 읽기 쉬운 형식으로 되돌아옵니다.
    반환된 데이터에서 found 필드는 조회가 성공했음을 나타냅니다._소스 필드가 원본 기록을 되돌려줍니다.
    { "_index" : "accounts", "_type" : "person", "_id" : "1", "_version" : 1, "found" : true, 
    "_source" : { "user" : " ", "title" : " ", "desc" : " " } }

    만약 Id가 정확하지 않으면 데이터를 찾을 수 없습니다.found 필드는false입니다.
    $ curl 'localhost:9200/weather/beijing/abc?pretty=true'
     { "_index" : "accounts", "_type" : "person", "_id" : "abc", "found" : false }

    5.3 레코드 삭제

    DELETE 'localhost:9200/accounts/person/1'

    여기에 우선 이 기록을 삭제하지 말고 뒤에 또 써야 한다.
    5.4 레코드 업데이트
    레코드 업데이트는 PUT 요청을 사용하여 데이터를 다시 전송하는 것입니다.
    PUT 'localhost:9200/accounts/person/1'
     { "user" : " ", "title" : " ", "desc" : " , " }'
     { "_index":"accounts", "_type":"person", "_id":"1", "_version":2, "result":"updated", 
    "_shards":{"total":2,"successful":1,"failed":0}, "created":false }

    위 코드에서 우리는 원시 데이터를'데이터베이스 관리'에서'데이터베이스 관리, 소프트웨어 개발'로 바꾸었다.반환 결과 안에 몇 개의 필드가 변했다.
    "_version" : 2, "result" : "updated", "created" : false

    기록된 Id는 변하지 않았지만 버전 (version) 은 1에서 2로 바뀌었고 작업 형식 (result) 은created에서 updated로,created 필드는false로 바뀌었습니다. 이번에는 새 기록이 아니기 때문입니다.

    6. 데이터 조회


    6.1 모든 레코드 반환


    GET 메서드를 사용하여/Index/Type/_ 직접 요청search, 모든 기록을 되돌려줍니다.
    $ curl 'localhost:9200/accounts/person/_search' 
    { "took":2, "timed_out":false, "_shards":{"total":5,"successful":5,"failed":0},
     "hits":{ "total":2, "max_score":1.0, 
    "hits":[ { "_index":"accounts", "_type":"person", "_id":"AV3qGfrC6jMbsbXb6k1p", "_score":1.0, "_source": { "user": " ", "title": " ", "desc": " " } },
     { "_index":"accounts", "_type":"person", "_id":"1", "_score":1.0, "_source": { "user" : " ", "title" : " ", "desc" : " , " } } ] } }

    위 코드에서 결과를 되돌려주는 took 필드는 이 작업의 소모 시간 (밀리초), timed_아웃 필드는 시간 초과 여부를 나타냅니다.hits 필드는 명중한 기록을 나타냅니다. 하위 필드의 의미는 다음과 같습니다.
  • total: 반환기록수, 본례는 2개..
  • max_score: 가장 높은 일치 정도, 본 예는 1.0..
  • hits: 되돌아오는 기록으로 구성된 수조..

  • 반환된 레코드 중 각 레코드에는 _score 필드, 일치하는 프로그램을 표시합니다. 기본값은 이 필드의 내림차순으로 배열됩니다.

    6.2 전체 텍스트 검색


    6.2.1 단일 레코드 조회

    GET 'http://localhost:9200/account/person/1'
    
    {
    
    "_index": "accouts",
    
    "_type": "person",
    
    "_id": "1",
    
    "_version": 2,
    
    "found": true,
    
    "_source": {
    
    "user": " ",
    
    "title": "java ",
    
    "desc": " "
    
    }
    
    }

    6.2.2 쿼리 레코드의 지정된 필드

    GET 'http://localhost:9200/accouts/person/1?_source_include=*ser&_source_exclude=title'

    쿼리 지정 필드 일치*user 필드 쿼리 제목 필드 없음
    GET http://localhost:9200/twitter/tweet/1?fields=title,content

    검색 title, content 필드

    6.3 쿼리체 쿼리(사용할 수 없음)


    7. 참조 링크

  • ElasticSearch 공식 매뉴얼
  • A Practical Introduction to Elasticsearch
  • 좋은 웹페이지 즐겨찾기