ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • elasticsearch는 어떤 segment 부터 읽을까?
    elasticsearch 2021. 4. 16. 21:09
    반응형

    오래된 segment? 가장 최근에 만들어진 segment?

    elasticsearch를 공부하면서 그냥 든 생각이 가장 오래 된 segment이 가장 최적화가 되어있을 가능성(물론 용량이 큰 파일은 삭제된 문서가 어느정도 선일 때는 머지되지 않아 비효율 적일 수도 있음)과 데이터가 많으므로 데이터를 찾을 수 있을 가능성이 더 높다고 생각을 했었었다 그러나 elasticsearch의 기반이 된다는 LSM(log structure merge) Tree를 공부할 때에는 가장 최근에 만들어진 파일부터 읽는다고 해서 궁금해서 여러 자료를 서치해봤지만 내 능력 밖인지 찾지를 못했다 그래서 별거는 아니지만 es는 필터를 주면 들어간 값 대로 리스팅 되므로 그것을 이용해서 테스트 해보기로 했다

     

    인덱스를 생성

    PUT my-index-000001
    {
      "settings": {
        "number_of_shards" : "1"
      },
      "mappings": {
        "properties": {
          "username": {
            "type": "keyword",
            "doc_values": true
          },
          "date": {
            "type": "date",
            "format" : "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_second"
          }
        }
      }
    }

     

    생성되어진 인덱스에 색인

    PUT my-index-000001/_doc/1
    {
      "date": "2020-01-11 17:00:02",
      "username": "test1"
    }
    
    PUT my-index-000001/_doc/2
    {
      "date": "2020-01-11 17:00:03",
      "username": "test1"
    }
    
    PUT my-index-000001/_doc/3
    {
      "date": "2020-01-11 17:00:04",
      "username": "test1"
    }
    
    PUT my-index-000001/_doc/4
    {
      "date": "2020-01-11 17:00:05",
      "username": "test1"
    }
    
    PUT my-index-000001/_doc/5
    {
      "date": "2020-01-11 17:00:06",
      "username": "test1"
    }
    
    PUT my-index-000001/_doc/6
    {
      "date": "2020-01-11 17:00:07",
      "username": "test1"
    }

     

    GET my-index-000001/_search
    {
      "version": true,
      "query": {
        "bool": {
          "filter": [
            {
              "term": {
                "username": "test1"
              }
            }
          ]
        }
      }
    }
    
    response 
    
    {
      "took" : 0,
      "timed_out" : false,
      "_shards" : {
        "total" : 1,
        "successful" : 1,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : {
          "value" : 6,
          "relation" : "eq"
        },
        "max_score" : 0.0,
        "hits" : [
          {
            "_index" : "my-index-000001",
            "_type" : "_doc",
            "_id" : "1",
            "_version" : 1,
            "_score" : 0.0,
            "_source" : {
              "date" : "2020-01-11 17:00:02",
              "username" : "test1"
            }
          },
          {
            "_index" : "my-index-000001",
            "_type" : "_doc",
            "_id" : "2",
            "_version" : 1,
            "_score" : 0.0,
            "_source" : {
              "date" : "2020-01-11 17:00:03",
              "username" : "test1"
            }
          },
          {
            "_index" : "my-index-000001",
            "_type" : "_doc",
            "_id" : "3",
            "_version" : 1,
            "_score" : 0.0,
            "_source" : {
              "date" : "2020-01-11 17:00:04",
              "username" : "test1"
            }
          },
          {
            "_index" : "my-index-000001",
            "_type" : "_doc",
            "_id" : "4",
            "_version" : 1,
            "_score" : 0.0,
            "_source" : {
              "date" : "2020-01-11 17:00:05",
              "username" : "test1"
            }
          },
          {
            "_index" : "my-index-000001",
            "_type" : "_doc",
            "_id" : "5",
            "_version" : 1,
            "_score" : 0.0,
            "_source" : {
              "date" : "2020-01-11 17:00:06",
              "username" : "test1"
            }
          },
          {
            "_index" : "my-index-000001",
            "_type" : "_doc",
            "_id" : "6",
            "_version" : 1,
            "_score" : 0.0,
            "_source" : {
              "date" : "2020-01-11 17:00:07",
              "username" : "test1"
            }
          }
        ]
      }
    }

    문서가 색인된 순서대로 값이 리스팅 되었다

    그럼 이제 같은 데이터를 재색인 한다

    PUT my-index-000001/_doc/1
    {
      "date": "2020-01-11 17:00:02",
      "username": "test1"
    }
    
    GET my-index-000001/_search
    {
      "version": true,
      "query": {
        "bool": {
          "filter": [
            {
              "term": {
                "username": "test1"
              }
            }
          ]
        }
      }
    }
    
    response
    
    "hits" : [
          {
            "_index" : "my-index-000001",
            "_type" : "_doc",
            "_id" : "2",
            "_version" : 1,
            "_score" : 0.0,
            "_source" : {
              "date" : "2020-01-11 17:00:03",
              "username" : "test1"
            }
          },
          {
            "_index" : "my-index-000001",
            "_type" : "_doc",
            "_id" : "3",
            "_version" : 1,
            "_score" : 0.0,
            "_source" : {
              "date" : "2020-01-11 17:00:04",
              "username" : "test1"
            }
          },
          {
            "_index" : "my-index-000001",
            "_type" : "_doc",
            "_id" : "4",
            "_version" : 1,
            "_score" : 0.0,
            "_source" : {
              "date" : "2020-01-11 17:00:05",
              "username" : "test1"
            }
          },
          {
            "_index" : "my-index-000001",
            "_type" : "_doc",
            "_id" : "5",
            "_version" : 1,
            "_score" : 0.0,
            "_source" : {
              "date" : "2020-01-11 17:00:06",
              "username" : "test1"
            }
          },
          {
            "_index" : "my-index-000001",
            "_type" : "_doc",
            "_id" : "6",
            "_version" : 1,
            "_score" : 0.0,
            "_source" : {
              "date" : "2020-01-11 17:00:07",
              "username" : "test1"
            }
          },
          {
            "_index" : "my-index-000001",
            "_type" : "_doc",
            "_id" : "1",
            "_version" : 2,
            "_score" : 0.0,
            "_source" : {
              "date" : "2020-01-11 17:00:02",
              "username" : "test1"
            }
          }
        ]

     

    해당 값은 refresh되서 새로운 segment가 시스템 캐시에 올라가고 그 뒤에 flush로 disk에 쓰여진다 새로운 segment가 가장 마지막에 있는 리스트로 나오게 되었으므로 추측하건대 가장 마지막으로 읽었다고 생각을 하게 되었다 물론 아닐 수도 있다

    그래서 루씬 개발자들에게 메일을 보낸 상태인데 답변이 오면 업데이트를 하도록 하겠다 별거아니지만 새벽까지 인터넷을 뒤져보고 포기했다가 갑자기 유레카처럼 테스트 해볼 수있을 것 같아 테스트를 해보았다고 의미 있는 시간이였다

    반응형

    댓글

Designed by Tistory.