2013년 11월 25일 월요일

Solr 검색의 이해 - Term 과 Slop

진행 중인 Site 에서 Solr 용어표를 작성하다가 아예 블로그에 옮깁니다.

다음은 Solr Wiki 의 내용을 참고하여 자체적으로 작성한 각 용어에 대한 설명입니다.(Glossary)

Lucene
검색엔진 라이브러리. 실제 검색을 담당하는 로직과 모든 알고리즘이 포함되어 있음. 라이브러리는 여러 S/W 의 집합을 의미함.
Solr
Luene 을 이용한 사용자 검색 플랫폼. 웹기반으로 사용자와의 인터랙티브한 질의응답이 가능하도록 만든 UI 플랫폼.
Terms
Lucene 에서 사용하는 검색어 단위. term 에는 Single term 과 Phrases 라는 두가지 타입의 term이 존재함.

Single term 은 "hello" 나 "dolly" 와 같이 한단어로 이루어지며, Phrase 는 "hello dolly" 와 같이 인용부호로 감싸여진 여러 단어로 이루어진다.
Index색인.

문서를 검색이 가능하도록 문서내용을 Lucene 의 자료구조로 변환하여 컴퓨터에 저장하는 행위.
Operator
연산자. 대표적으로 "AND" 와 "OR" 연산자가 있음.

OR 연산자는 두 term 들을 연결하여 이 term 들중 하나라도 문서에 존재하는지 검색하며 이는 합집합 연산과 동일함.

AND 연산자는 두 term 을 모두 갖는 문서들을 검색하며 이는 교집합 연산과 동일하다. "jakarta apache" 와 "jakarta lucene" 과 같이 Phrases terms 를 포함하고 있는 문서들을 검색하려면,
"jakarta apache" AND "jakarta lucene"

두개의 terms 사이에 AND 연산자를 삽입하여 질의하면 된다.
Score
Lucene 에서는 모든 검색결과에 Score 를 계산하고, 우선순위를 지정하여 높은순으로 사용자 에게 반환함.

Score 알고리즘은 Index 알고리즘에 의존적이기 때문에 Index 알고리즘을 먼저 이해하여야 하나, 정리하자면 다음과 같이 여러 요소들이 같이 계산됨


  • Term Frequency
  • Inverse Document Frequency
  • Coordination Factor
  • Field Length
Boost
Lucene은 발견된 term 을 기반으로 문서가 일치하는 정도를 판단하는 기능을 제공함. 

term을 boosting 함으로써, 문서의 검색결과를 제어할수 있다. 사용법은 term 의 끝에 boost factor(숫자)와 함께 캐럿 기호"^"를 사용한다.

기본 Boost factor 는 "1" 임.  예를 들어 질의어를 다음과 같이
(title: "축구" OR title: "한일전")^1.5 OR (content: "축구" OR content: "한일전")

하면 content 와 title 모두 "축구" 와 "한일전" 문구가 포함된 검색결과를 리턴하지만, title 검색결과를 우선적으로 리턴함.
Proximity matchingLucene 은 terms 간의 distance 검색을 지원함.

"축구" 와 "한일전" 이라는 단어가 4개의 다른 terms 사이에 있는 문서를 검색하고자 한다면,
"축구 한일전"~4

위와 같이 와 숫자기호(slop)를 사용하여 질의를 하면 된다.
Slop
Slop 은 Lucene 에서 사용하는 검색범위의 단위라 할수 있다.

Proximity match 검색에서 "축구 한일전"~4 와 같이 검색을 하였으면 slop 은 4이며

"축구 한일전"~3  으로 검색하면 3 slop 을 준것임.
당연히 두개의 검색결과는 차이가 있다. 


위의 용어표를 보면 알겠지만, 모든 검색엔진에서는 색인(Index) 및 검색(Search)의 기준이 되는 단위가 존재하는데, Lucene 은 term 이라는것 을 기준으로 사용하는걸 알수 있습니다.

slop 관련 잘 설명되어 있는 문서는 여기를 참조하시기 바랍니다.

요약하자면, txt 파일에 다음과 같은 내용이 있을때

Here are some foods that Deron likes:
hamburger
french fries
steak
mushrooms
artichokes
"hamburger steak"~1 과 "hamburger steak"~2 으로 했을때 검색결과의 차이점을 눈여겨 보시기 바랍니다.

"hamburger steak" 질의는 "hamburger steak"~0 과 동일한 결과를 나타냅니다.

Hit: C:\projects\workspace\demo\filesToIndex\deron-foods.txt

Query: contents:"hamburger steak"
Number of hits: 0

Query: contents:"hamburger steak"~1
Number of hits: 0

Query: contents:"hamburger steak"~2
Number of hits: 1
Hit: C:\projects\workspace\demo\filesToIndex\deron-foods.txt

Query: contents:"hamburger steak"~3
Number of hits: 1
Hit: C:\projects\workspace\demo\filesToIndex\deron-foods.txt

Searching for 'french fries' using QueryParser
Type of query: BooleanQuery
Query: contents:french contents:fries
Number of hits: 1
Hit: C:\projects\workspace\demo\filesToIndex\deron-foods.txt

Searching for '"french fries"' using QueryParser
Type of query: PhraseQuery
Query: contents:"french fries"
Number of hits: 1
Hit: C:\projects\workspace\demo\filesToIndex\deron-foods.txt

Searching for '"hamburger steak"~1' using QueryParser
Type of query: PhraseQuery
Query: contents:"hamburger steak"~1
Number of hits: 0

Searching for '"hamburger steak"~2' using QueryParser
Type of query: PhraseQuery
Query: contents:"hamburger steak"~2
Number of hits: 1
Hit: C:\projects\workspace\demo\filesToIndex\deron-foods.txt

댓글 없음:

댓글 쓰기