2017-05-21 2 views
0

Lucene에서 SQL의 LIKE 기능을 복제하려고합니다. 나는 와일드 카드를 사용하여 검색하는 경우lucene의 문장 LIKE 기능

말 "* 튤립 인 Riyadhh는 *"나는 다음과 같은 행동에 직면하고있어 : -

  • 튤립 인 Riyadhhhss 일치 -

    1. 튤립 인 리야드
    2. 일치하지 않는
    3. 튤립 인 리야드 hhss -
    4. 튤립 매칭 -
    01 매칭 -
  • Riyadhh 일치

    사실 "2"조건과 "4"조건이 일치해야하는 Lucene의 예제가 필요합니다.

    모든 쿼리를 시도했지만 두 번째 시나리오가 일치하지 않습니다.

    일부 사용자는 Tokenizer 및 사용자 지정 분석기를 사용하는 것이 좋습니다.

    저는 Lucene을 처음 사용했기 때문에 쿼리 작업을 했었지만 Tokenizer와 사용자 지정 분석기를 쿼리에 통합하는 방법을 모릅니다.

  • +0

    검색에 관련된 필드의 분석기 체인을 추가하면 사용했던 Solr의 버전과 시도한 쿼리에 사용 된 모든 매개 변수가 많이 도움이됩니다. – freedev

    답변

    0

    경우 접두사 일치, 당신은 LowercaseFilter와 EdgeNgramFilter와 KeywordTokenizer을 사용할 수 원하는 :

    <analyzer> 
        <tokenizer class="solr.KeywordTokenizerFactory"/> 
        <filter class="solr.LowerCaseFilterFactory"/> 
        <filter class="solr.EdgeNGramFilterFactory" minGramSize="4" maxGramSize="50"/> 
    </analyzer> 
    

    하나의 토큰 (KeywordTokenizer)로 들어오는 텍스트를 유지하는 것이 체인, 다음으로 변환 들어오는 텍스트를 소문자로 변환 (LowerCaseFilter) 한 다음 문자열 길이에 따라 여러 토큰으로 분할합니다. 당신이 문자열 내에서 어느 곳과 일치 할 경우

    , 당신은 일반 ngramfilter 사용할 수 있습니다

    <filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="4"/> 
    

    을 ..하지만 최소 및 최대 사이의 차이가있는 경우 색인의 크기가 빠르게 성장할 것으로 인식 큰.

    두 번째 옵션도 있는데, 이는 *foo* 쿼리 조건에 맞게 조정 된 ReversedWildcardFilter를 사용하므로 각 토큰의 처리가 더 이상 필요하지 않은 경우 (예 : 각 토큰의 형태를 취하는 등) 그것은 옵션 일 수 있습니다.