Apache Solr에서 더 나은 검색 쿼리를위한 10 가지 팁

Apache Solr는 핵심은 오픈 소스 검색 엔진이지만 그 이상입니다. 트랜잭션을 지원하는 NoSQL 데이터베이스입니다. SQL 지원을 제공하고 분산 방식으로 실행하는 문서 데이터베이스입니다.

이전에는 컬렉션을 만들고 Solr에로드하는 방법을 보여 드렸습니다. 이전에 수행하지 않은 경우 지금 해당 컬렉션을로드 할 수 있습니다. (전체 공개 : 저는 Solr 프로젝트에 많은 주요 기여자들을 고용하는 Lucidworks에서 일합니다.)

이 게시물에서는 해당 컬렉션으로 할 수있는 작업 10 가지를 더 보여 드리겠습니다.

1. 쿼리 필터링

다음 쿼리를 고려하십시오.

//localhost:8983/solr/ipps/select?fq=Provider_State:NC&indent=on&q=*:*&wt=json

겉으로보기에이 쿼리는 내가 방금했을 때와 비슷해 보입니다 q=Provider_State:NC. 그러나 필터 쿼리는 ID 만 반환하며 점수에는 영향을주지 않습니다. 필터 쿼리도 캐시됩니다. 이것은 가장 관련성이 찾을 수있는 좋은 방법입니다 q=blue suededepartment:footwear반대 department:clothing하거나 department:music.

2. 패싯

이 쿼리를 시도하십시오.

//localhost:8983/solr/ipps/select?facet=on&facet.field=Provider_State&facet.limit=-1&indent=on&q=*:*&wt=json

다음은 맨 위에 반환됩니다.

신분증

패싯은 카테고리 수를 제공합니다. 소매 사이트를 구현하는 경우 이는 부서에 대한 카테고리 및 카테고리 수를 제공하는 방법 또는 인벤토리를 나누는 다른 방법입니다.

3. 범위 패싯

다음을 쿼리 문자열에 추가합니다. facet.interval=Average_Total_Payments&facet.interval.set=[0,1999.99]&facet.interval.set=[2000,2999.99]&facet.interval.set=[3000,3999.99]&facet.interval.set=[4000,4999.99]&facet.interval.set=[5000,5999.99]&facet.interval.set=[6000,6999.99]&facet.interval.set=[7000,7999.99]&&facet.interval.set=[8000,8999.99]&facet.interval.set=[9000,10000]

당신은 얻을 것이다:

이 범위 패싯은 숫자 필드를 범위 범주로 나누는 데 도움이 될 수 있습니다. 누군가가 $ 2,000- $ 3,000 범위의 노트북을 찾도록 돕는다면 이것은 당신을위한 것입니다. 대신 다음을 수행하여 범위를 하드 코딩하지 않고도 유사한 쿼리를 수행 할 수 있습니다.facet.range=Average_Total_Payments&facet.range.gap=999.99&facet.range.start=2000&facet.range.end=10000

4. DocValues

스키마에서 docValues패싯중인 필드에 대해 속성이 선택 되었는지 확인하십시오 . 이렇게하면 다음 schema.xml 발췌 부분에 표시된 것처럼 이러한 종류의 검색에 대해 필드가 최적화되고 쿼리시 메모리가 절약됩니다.

5. 의사 필드

데이터에 대한 작업을 수행하고 값을 반환 할 수 있습니다. 이 시도:

//localhost:8983/solr/ipps/select?fl=Provider_Name,%20Average_Total_Payments,price_category:if(min(0,sub(Average_Total_Payments,5000)),%22inexpensive%22,%22expensive%22)&indent=on&q=*:*&rows=10&wt=json

이 예제는 Solr의 내장 함수 중 일부를 사용하여 평균 총 지불액을 기준으로 공급자를 비싸거나 저렴한 것으로 분류합니다. 내가 넣어 price_category:if(min(0,sub(Average_Total_Payments,5000)),"inexpensive","expensive")fl두 개의 다른 분야와 함께, 또는 필드의 목록입니다.

6. 쿼리 파서

defType을 사용하면 Solr의 쿼리 구문 분석기 중 하나를 선택할 수 있습니다. 기본 표준 쿼리 파서는 특정 기계 생성 쿼리에 정말 좋습니다. 그러나 Solr에는 Dismax 및 eDismax 파서도있어 일반 사용자에게 더 좋습니다. 관리자 쿼리 화면 하단에서 그중 하나를 클릭하거나 defType=dismax쿼리 문자열에 추가 할 수 있습니다. Dismax 파서는 일반적으로 "분리 최대 값"또는 가장 많이 일치하는 필드를 찾아 점수에 추가하여 사용자가 입력 한 쿼리에 대해 더 나은 결과를 생성합니다.

7. 부스팅

를 검색하면 Provider_State:AL^5 OR Provider_State:NC^10노스 캐롤라이나의 결과가 앨라배마의 결과보다 높은 점수를받습니다. 쿼리 ( q="") 에서이를 수행 할 수 있습니다 . 이것은 반환 된 결과를 조작하는 중요한 방법입니다.

8. 기간

예제 데이터는 날짜 범위 검색을 지원하지 않지만 지원하는 경우 다음과 같은 형식이 timestamp_dt:[2016-12-31T17:51:44.000Z TO 2017-02-20T18:06:44.000Z]됩니다. Solr는 날짜 유형 필드와 날짜 유형 검색 및 필터링을 지원합니다.

9. TF-IDF 및 BM25

Solr이 (검색 용어와 관련된 문서를 결정하기 위해) 사용한 원래 채점 메커니즘은 "용어 빈도 대 역 문서 빈도"에 대해 TF-IDF라고합니다. 필드 또는 문서에서 용어가 발생하는 빈도와 컬렉션에서 해당 용어가 전체적으로 발생하는 빈도를 반환합니다. 이 알고리즘의 문제는 "왕좌의 게임"이 10 페이지 문서에서 100 번 발생하는 반면 10 페이지 문서에서 10 번 발생하면 문서의 관련성이 10 배 더 높아지지 않는다는 것입니다. 그것은 수 많은 관련이 아닌 1 0 배 관련.

BM25는이 프로세스를 원활하게하여 문서가 포화 점에 도달 할 수 있도록하여 추가 발생의 영향을 완화합니다. 최신 버전의 Solr은 모두 기본적으로 BM25를 사용합니다.

10. debugQuery

관리 쿼리 콘솔에서 debugQuery를 확인 debugQuery=on하여 Solr 쿼리 문자열 에 추가 할 수 있습니다 . 결과를 살펴보면 다음 출력을 찾을 수 있습니다.

무엇보다도 LuceneQParser (표준 쿼리 파서의 이름)를 사용하고 있으며, 그 위에 각 결과의 점수를 매기는 방법이 있습니다. BM25 알고리즘 자체와 부스트가 점수에 어떤 영향을 미치는지 확인할 수 있습니다. 검색을 디버그하려는 경우 매우 유용한 도구입니다!

Solr의 10 가지 측면은 Solr를 사용하여 검색 및 결과를 조정할 때 확실히 도움이됩니다.