2011-09-21 2 views
6

SOLR 3.2를 사용하고 있습니다. 내 응용 프로그램은 SOLR 인스턴스에서 텍스트 필드 유형에 대한 검색 쿼리를 실행합니다. 사용자가 "book"과 같은 쿼리를 발행하면 "book", "bookshelf", "bookasd"등과 같은 결과를 반환하도록 SOLR을 어떻게 만들 수 있습니까? "*"문자를 쿼리 문자열에 수동으로 추가해야합니까? 아니면 SOLR에 설정이 있습니까? 그래서 필드에서 접두어 검색을 기본적으로 수행합니까?사용자가 기본적으로 접두사 검색을 할 수 있도록 SOLR을 구성하는 방법은 무엇입니까?

이 텍스트 필드 유형에 대한의 schema.xml 섹션은 다음과 같습니다

<fieldType name="text" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer type="index"> 
     <charFilter class="solr.HTMLStripCharFilterFactory"/> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" 
       ignoreCase="true" 
       words="stopwords.txt" 
       enablePositionIncrements="true" 
       /> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="1" splitOnCaseChange="0"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
     </analyzer> 
     <analyzer type="query"> 
     <charFilter class="solr.HTMLStripCharFilterFactory"/> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenat0All="1" splitOnCaseChange="0"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
     </analyzer> 
    </fieldType> 
+0

아직 답변을 찾지 못하셨습니까? –

답변

0

당신은 검색어의 끝에서 와일드 카드 문자를 추가하여 클라이언트 측에서 처리를해야 할 것 중 하나.

영향 : -

  1. 와일드 카드 쿼리는
  2. 와일드 카드 쿼리 분석을받지 않는 성능에 영향을. 따라서 검색어 시간 분석은 검색어에 적용되지 않습니다.

다른 옵션으로 필요한 처리 기능을 갖춘 맞춤식 쿼리 구문 분석기를 구현할 수 있습니다.

1

프로젝트에 대한 요구 사항이 동일했습니다. 제안을 구현해야했습니다. 무엇 내가 한 일은 내가 한 광석 이상의 단어로 구성 제안을 얻을 필요하기 때문에 내가 ShingleFilterFactory 사용이 SUGGESTER fieldType

<fieldType class="solr.TextField" name="suggester"> 
    <analyzer type="index"> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 

     <filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="3" outputUnigrams="true" outputUnigramsIfNoShingles="false" /> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_en.txt" enablePositionIncrements="true" /> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

을 정의했다.

그런 다음 faceting 쿼리를 사용하여 제안을 받았습니다.

Facet.Limit =

10 Facet.Prefix = "책"

Facet.Field = "SUGGESTER"//이fieldType = "SUGGESTER"와 함께 필드 인 I 데이터를 저장했습니다.

나는 패싯 결과를 사용하지만 귀하의 문제를 해결할 수 있다는 것을 알고 있습니다.

내 또는 Jayendra Patil's answer 당신에게 솔루션을 제공하지 않는 경우 당신은 또한이 작업을 수행하는 방법은 여러 가지가 있습니다 EdgeNGramFilterFactory

0

나 '사용 할 수 있습니다 당신이 지금까지 알아 낸 것이 틀림 없겠지만 여기에 대답이 있습니다 :

나는 마지막 용어를 취하고 마지막 용어에 OR 와일드 카드를 더하는 것으로 처리했습니다. "내가 좋아하는 책"은 "내 + 좋아하는 책 (책 또는 책 *)"이되어 "내가 좋아하는 책꽂이"를 반환합니다. 어쨌든 (이스케이프 등) 입력에 대한 처리를 원할 수도 있습니다.

결과의 시작 부분과 일치하도록 입력 된 텍스트를 찾고 있다면 가장자리 n 그램을 사용하는 것이 좋습니다. 그러나 질문을 읽지 못했을 때 실제로 묻는 것처럼 보이지 않습니다.

관련 문제