'max'에 해당되는 글 2건

  1. 2020.02.18 [Elasticsearch] Block-Max WAND 가 뭔가요?
  2. 2015.11.24 [Lucene] CustomScoreQuery vs. DisjunctionMaxQuery

[Elasticsearch] Block-Max WAND 가 뭔가요?

Elastic/Elasticsearch 2020. 2. 18. 14:48

Top N 개에 대한 문서를 검색 하기 위한 성능 개선 제안으로 2012년에 처음 이슈화 되었던 것 같습니다.

처음에 저도 WAND 가 뭐지?? 했었는데요.

 

기억력이 나빠서 자꾸 잊어버리네요.

 

Weak and = Weak AND = WAND 이렇게 됩니다.

즉, Elasticsearch 에서는 minimum_should_match 라는 개념이 들어가 있다는 것인데,

정확도가 떨어지지 않는다고 합니다.

어찌되었든,  WAND와 유사 개념이라고 보시면 이해 하기 쉬우실 것 같습니다.

 

근데 앞에 보시면 Block-Max 라고 붙어 있죠.

이걸 또 초간단하게 설명 하면 문서를 특정 블럭단위로 묶으고 그 안에서의 Max Score 를 기록해 두는 방식 입니다.

이렇게 해서 문서 스캔 범위를 줄이게 되어 성능성 이득을 볼 수 있는 내용이라고 보시면 될 것 같습니다.

 

뭐 문서랑 알고리즘을 잘 읽어 보시면 더 심오한 내용이 있으나 쉽게 접근하는 것도 중요하다고 생각 하기 때문에 이렇게 정리 하도록 하겠습니다.

 

자세한 내용이 궁금하신 분은 아래 문서 보시면 됩니다.

http://engineering.nyu.edu/~suel/papers/bmw.pdf

bmw.pdf
0.32MB

 

 

더불어 Elastic 공홈에 올라온 관련 글 링크 입니다.

https://www.elastic.co/blog/elasticsearch-7-6-0-released
https://www.elastic.co/blog/faster-retrieval-of-top-hits-in-elasticsearch-with-block-max-wand
https://www.elastic.co/blog/index-sorting-elasticsearch-6-0

 

여기서 추가적으로 나오는 기법들이  

 

- Early Termination

이건 탐색 할 때 특정 조건에 맞춰 전체를 스캔 하지 않고 중간에 멈추고 스캔한 문서를 대상으로 리턴 하는 방식입니다.

- Document At A Time

문서에 대한 포인트 탐색 으로 보시면 될 것 같고 성능이 우수 합니다.

- Term At A Time

색인어에 대한 탐색을 하는 것으로 별도의 데이터구조에 따른 병목이 발생 할 수 있습니다.

 

등이 있습니다.

 

최종 정리를 하면,

1. Top N 개에 대해서 빠르게 조회를 한다.

2. 정확도가 떨어지지 않는다.

3. 그러므로 고민 하지 말고 최신 Elasticsearch 를 사용 하면 알아서 성능적 향상을 가져 올 수 있으니 사용 하시면 된다

는 이야기 였습니다.

 

:

[Lucene] CustomScoreQuery vs. DisjunctionMaxQuery

ITWeb/검색일반 2015. 11. 24. 15:05

검색 서비스를 운영하다 보면 문서에 대한 부스팅 작업이 필요 할 때가 있습니다.

부스팅의 목적은 다양할 수 있는데요.

한 문장으로 정리를 하면, 

"특정 문서를 검색 결과 상위에 노출시키기 위해 사용"

한다고 보시면 됩니다.


문서에 대한 부스팅 작업은 아래와 같은 방법으로 구현이 가능 합니다.


1. 질의 부스팅

"Query time boosting" 이라는 것은 질의 시 특정 필드 또는 질의어에 대한 가중치를 부여하여 질의 시점에 적용하는 방식을 말합니다.


2. 색인 부스팅

"Index time boosting" 이라는 것은 색인 시 특정 필드 또는 문서에 대한 가중치를 부여하여 색인 시점에 적용하는 방식을 말합니다.


3. 필드 부스팅

"Field boosting" 이라는 것은 특정 필드에 대한 가중치가 또는 중요도가 높다는 것을 반영하여 적용하는 방식을 말합니다.


4. 도큐멘트 부스팅

"Document boosting" 이라는 것은 특정 문서 자체에 대한 가중치가 또는 중요도가 높다는 것을 반영하여 적용하는 방식을 말합니다.


5. 커스텀 부스팅

"Custom boosting" 이라는 것은 임의 문서에 대한 가중치와 스코어에 대한 조작을 통해 적용하는 방식을 말합니다.


부스팅에 대한 구현 방법을 살펴 보았는데요.

이것들은 아래의 API를 통해서 구현 하게 됩니다.


바로 DisjunctionMaxQuery 와 CustomScoreQuery 입니다.

물론 lucene에서 제공하는 다른 API 또는 Elasticsearch 나 Solr 에서 제공하는 다양한 방식으로 구현이 가능 합니다.



DisjunctionMaxQuery 를 이용해서 구현 가능한 것은

1. 질의 부스팅

3. 필드 부스팅

정도로 보입니다.


반대로 CustomScoreQuery 는 다양하게 구현이 가능합니다.

Elasticsearch 기준으로 보면 FunctionScoreQuery + DisjunctionMaxQuery 를 섞어서 사용이 가능 하기 때문에 2. 색인 부스팅을 제외 하고는 다 구현이 가능 하다고 보면 될 것 같습니다.


자 이제 급 마무리를 해보겠습니다.

뭐 말은 만드는 사람 맘이고 해석도 하는 사람 맘이니 저랑 다르게 생각하시는 분들이 계실 겁니다.

다만 내용이 틀렸거나 잘못되었다면 좀 알려주세요. ^^;


[Dis Max Query]

- 질의 시점에 사용을 합니다.

- Field 에 대한 가중치를 주어 부스팅을 합니다.

- 구현하기 쉽습니다.

- 순수하게 검색엔진에 맡겨처 처리 합니다.


[Custom(Function) Score Query]

- 질의 시점에 사용을 합니다.

- Field, Document 에 대한 가중치를 주어 부스팅을 합니다.

- 제공하는 API 가 많기 때문에 어렵지 않습니다.

- 다양한 방법으로 구현이 가능 합니다.

- 다양한 알고리즘 또는 요건을 만족 시키기 위해 사용을 합니다.

- 문서 내 특정 값을 이용하여 부스팅에 적용 할 수 있습니다.

- 복잡할 수록 성능이 느려 질 수 있습니다. 


과거에 fulltext 검색으로 사용하는 게시판류 서비스 뭐 이런데에서는 dis max query + query string 을 즐겨 사용하곤 했는데요.

지금은 좀 더 정교하게 부스팅을 하기 위해서 custom(function) score query 를 많이 사용하는것 같습니다.

특히 쇼핑몰 같은 경우는 dis max 보다는 custom score 가 적합한 query라고 생각 합니다.

: