Lucene은 Apache Software Foundation에서 Java로 개발한 오픈소스 정보 검색 라이브러리이다. 핵심 기능은 문서 색인과 검색이다.
문서를 분석하고 검색 가능한 형태로 변환하여 저장하는 과정
용어가 원래 들어있던 텍스트에 용어를 매핑하는 데이터 구조
색인의 반대 개념으로, '단어' -> '문서' 매핑 구조를 가진다.
원문을 검색 가능한 토큰으로 분리 및 처리하는 과정
색인에서 원하는 정보를 찾아내는 과정
검색 결과의 관련성 평가 및 순위 부여

입력 문서로 File이 들어오면 IndexWriter가 해당 문서를 처리하여 Index DB를 생성한다.
사용자가 Query를 입력하면 QueryParser가 해석을하고, Searcher를 통해 Index DB에서 적합한 결과를 IndexReader가 검색한다.
Azure AI Search는 내부적으로 Lucene을 기반으로 하며, Lucene의 검색 기능을 클라우드 서비스로 제공한다.
Azure AI Search에서 QueryType.FULL을 지정하면 Lucene 쿼리 구문을 사용한다는 의미이다. 아래의 Lucene 쿼리 구문의 기능을 활용해 보다 정교한 검색을 구현할 수 있다.
fun searchWithLucene(searchClient: SearchClient, queryString: String) {
val searchOptions = SearchOptions()
.setQueryType(QueryType.FULL) // Lucene 쿼리 구문 활성화
.setIncludeTotalCount(true)
.setSelect("id", "title", "content")
.setOrderBy("score desc")
검색 쿼리를 처리하는 방식을 결정하는 이넘 타입
filedName:value 형식으로 특정 필드에서만 검색
title:"Azure Search" // title 필드에 Azure Search가 포함된 문서를 검색
title:"Azure Search" AND author:"Microsoft" // 여러 필드 검색
*(다중 문자), ?(단일 문자)를 사용한 패턴 매칭
Az*re // Azure, Azre 등 매칭
Azu?e // Azure 매칭 :: Azu로 시작하고 e로 끝나며 중간에 한 글자가 있는 단어 검색
~ 연산자를 사용해 철자가 유사한 단어 검색
azur~ // azure, azul 등 유사한 단어 매칭
~n 을 사용해 단어 간 거리가 n 이하인 경우를 검색
"azure cloud"~2 // azure와 cloud 사이에 최대 2개 단어까지 허용
^n을 사용해 특정 용어나 구문의 중요도를 높임
azure^2 cloud // azure를 cloud보다 2배 중요하게 처리
AND, OR, NOT(+,-)을 사용한 복합 검색
azure AND cloud // azure 와 aws 모두
azure OR aws // azure 또는 aws 중 하나
azure NOT aws // azure는 포함하지만 aws는 제외
+azure -aws // azure는 반드시 포함, aws는 제외
괄호를 사용해 쿼리를 그룹화
(azure OR microsoft) AND cloud // azure 또는 microsoft 중 하나를 포함하고, cloud도 포함하는 문서 검색
숫자나 날짜 등의 범위 검색
price:[100 TO 200] // 100 이상 200 이하, []는 경계값 제포함
date:{2023-01-01 TO 2023-12-31} // 2023년(양 끝 제외), {}는 경계값 제외
https://lucene.apache.org/
https://learn.microsoft.com/ko-kr/azure/search/query-lucene-syntax
오픈소스 검색엔진 Lucene
https://learn.microsoft.com/ko-kr/dotnet/api/azure.search.documents.models.searchquerytype?view=azure-dotnet