프로그래밍/ElasticSearch 2015. 5. 15. 11:23
http://localhost:9201/_cluster/health?pretty=true 
위 URL처럼 해당 클러스터 노드에 쿼리 할 경우 아래 와 같은 json array 타입으로 클러스터 상태를 알 수 있다.
{
  "cluster_name" : "clustername",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 40,
  "number_of_data_nodes" : 10,
  "active_primary_shards" : 7,
  "active_shards" : 70,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0
}


//
프로그래밍/ElasticSearch 2015. 5. 7. 00:02

elasticsearch query 는 보통 아래와 같은 쿼리를 많이 사용하게 되는데


------------------------------------------------

   query :{

       match / query_string:{

            analyzer: ~~~

               ~~~~~

     }

}

------------------------------------------------

{

    query : {

       bool : {

          should/must :{  [

              ~~~~~~

          ],[

               filter : { term: ~~~}

             ~~~~~~~

          ]

         }

      }

   }

}

------------------------------------------------


filter와 query 를 많이 사용하게 된다.  

filter / term 조합, query / match 조합을 사용하게 된다. filter 를 사용할시 해당 필드와 정확히 같은 내용을 찾는 것이고, query의 경우 해당 ES 인스턴스가 사용하는 analyzer에 의해서 분석된 결과 값을 보여준다. 


//
프로그래밍/ElasticSearch 2015. 4. 6. 22:10

index에 문제가 생겨 해당 네임으로 다시 인덱스 생성(mapping 부터) 할 시에 이전 index가 계속 나오는 현상.

index delete 후에도 index 가 계속 나옴. 업데이트 됐다고 하는데 일부버전에서 문제가 계속 되나 보다.

로컬 gateway 의 recovery에서 dangled index 를 계속 올리는 현상인듯 하다.

관련 url )  https://github.com/elastic/elasticsearch/issues/2067

1) index delete 

$ curl -XDELETE 'http://localhost:9200/indexname/'




해당 해결 방법

elasticsearch.yml 에 

gateway.local.auto_import_dangled : no 

설정을 주고 es 재시작 후 index 생성한다. 


//
프로그래밍/ElasticSearch 2015. 3. 26. 14:52

참고 자료 :http://lucene.apache.org/core/2_9_4/api/core/org/apache/lucene/search/Similarity.html


  • 요소항목 설명
 -Term Frequency(tf) : 쿼리하는 키워드가 몇번 나왔는지에 대한 수치이다. 나온 수치의 루트값을 이용한다. 
        tf(t in d) = √frequency
    -Inverse Document Frequency(idf) : 역빈도 내용인다. 전체 document에서 해당 term이 얼마나 나왔는지를 측정. 다수의 문서에서 나온다면 이 term은 중요하지 않은 것을 간주하고 낮은 weight를 갖는다.
        idf(t) = 1 + log ( numDocs / (docFreq + 1)) 
	-field length norm : term의 중요도를 측정하는 수치이다. 해당 document에 term의 갯수가 적을 때 더 큰 weight를 갖는다. term의 갯수의 루트 값을 이용한다. 
		ex) query string : 로이조, 로이조 주말 핫녹(high), 로이조 주말 핫 녹화 방송(low) <둘을 대상으로 했을때 상대적인>        
		norm(d) = 1 / √numTerms
    -queryNorm : 두개 이상의 term으로 쿼리할때 두개의 쿼리에 대한 normalize를 위함이다. 두개의 term으로 쿼리할 경우 query:{ bool:{should:[{term:{field:'aaa'}},{term:{field:'bbb'}}] } 로 
                 검색하게 된다. 이 과정에서 두개의 쿼리로 쪼개지고 두 단어에 대한 상대적인 차이(관계)를 구하기 위함이다. term이 1개일 경우 의미 없다. 
                 =1 / √sumOfSquaredWeights    /     sumOfSqueredWeights = Sigma(t in q)(idf(t) * getBoost(t in q))^2 // 

    -coord : 검색 term이 많이 hit될 수록 보상하는 수치. 검색된 문서에서 쿼리의 Term이 몇 개 들어있는지에 대한 값. (3개단어로 검색쿼리 했고 2개 단어가 맞아 떨어짐. 해당 단어에 대한 점수  * 2/3)
    -t.getboost : 쿼리시에 넣을 수 있는데 더 높은 가중치를 줘서 검색하게 됨. queryNorm 계산시에 들어감. 
 
  • 계산 되는 순서 및 로직
 1) 각 term단위로 fieldweight(tf * idf * fieldnorm) 을 구한다.
 2) 각 term단위로 queryNorm 을 구한다. 
 3) 위 둘을 곱한 값들을 갖고 더한다. 
  • multi term에서 유사관계 판단

cosine similarity 관계. happy hippopotanus로 쿼리 하였을 때 happy 2, hippopotamus 5 의 weight를 갖는다고 하자. 그럼 happy 만 들어간 doc, hippopotamus 만 들어간 문서, 둘 다 들어간 문서에서 각 단어의 weight를 구해 아래와 같이 표현한다. 그리고 쿼리의 벡터와 비슷한 각도를 따지는 것이다. 아래에서는 3번의 doc이 일치했다. happy와 같은 단어는 common word 이므로 어디서나? 낮은 점수가 나올 것 이다.

ex)1) you look happy, 2) you look like hippopotamus 3)you look so happy, hippopotanus 


//