2010-07-29 6 views
2

Lucene NOOB 알림!Lucene 내의 검색어 유형

필자는 적어도 합리적인 인텔리전스의 사람이라고 생각하지만 Lucene 내의 쿼리 유형을 정신적으로 괴롭히는 데 엄청난 문제가 있습니다.

내 특정 인스턴스에서 내 문서에서 단 하나의 문자열 필드 만 검색 할 필요가 있습니다 (평균 50 자 정도).

사용자가 검색하려는 항목 내에 단어 시작을 입력 할 수있게하려고합니다. 또한 용어를 제공하는 순서를 지정하지 않아도됩니다.

예 필드 : "일반 브랜드 강도"

은 검색과 일치해야합니다 : "일반 브랜드 강도" "브랜드 일반적인 강도" ... "세대 겨 STR" "밀기울 일반적인 STR" 합니다. .. 등

내 정보 (예제의 각 단어)는 도움이 될만한 정보가 있으면 별도의 입력란에 저장할 수 있지만 그럴 것이라고 확신하지는 않습니다.

현재 퍼지 와일드 카드 및 다중 단어 구문이 사용되지 않습니다.

누구나 나를 위해이 모든 시나리오를 명확히 할 수 있습니까? (그리고 네, 저는 온라인으로 광범위하게 도움을 구했지만 괜찮은 리소스를 찾을 수 없습니다).

BTW 나는 Lucene 2.9를 사용하고 있지만 실제로는 중요하지 않다고 생각합니다.

답변

4

각 용어를 별도의 필드에 저장할 필요는 없습니다. Lucene은 각 용어에서 토큰을 생성하므로 (공백 토큰 화 도구를 사용하는 경우) 검색의 유연성이 뛰어납니다.

예 필드 : "일반 브랜드 강도"

이 검색과 일치해야합니다 : "브랜드 일반적인 강도"

을 "일반 브랜드 힘"에 대한 질문에

위의 쿼리는 두 결과를 모두 반환하며 후자는 명백한 이유로 낮은 점수를 반환합니다. 그러나 "gen bran str", "bran generic str"... 등은 까다 롭습니다. 용어가 표준 "줄기"가 아니기 때문에 줄기 분석기를 사용할 수 있습니다.

  1. 은 공백으로 쿼리 구문을 분할하면 문자열 []
  2. 사용하십시오 Booleanquery이 있도록, 그리고 와일드 카드로를 추가 각 용어에 대한 쿼리를 만들 :

    가장 간단한 방법은하는 것 끝.

    string[] terms = query.split(" "); 
    BooleanQuery bq = new BooleanQuery(); 
    
    foreach(string term in terms) 
    bq.Add(new Query("FieldName", term + "*",...); 
    

    는 등 SpanQuery, DisMax으로 더 나은 쿼리 유형이 있습니다 :

뭔가처럼, 그러나 당신이 멍청한 사람들의 경고를 언급 한 이래로, 위가 가장 단순하다고 생각합니다.

HTH

+0

+1 와일드 카드 솔루션. 가장 쉬운 방법이지만 큰 인덱스의 경우 성능 문제가 발생할 수 있습니다. – bajafresh4life

+0

wilcard 쿼리 사용 (별표 추가)과 PrefixQuery 사이에 주목할만한 차이가 있습니까? 그들은 나처럼 똑같아 보인다. 생각? 그들은 기본적으로 똑같은 삶을 누릴 수 있습니까? – berko

+0

예 그들은 동일합니다. Javadocs에서는 다음과 같이 설명합니다. "지정된 접두사가있는 용어를 포함하는 문서와 일치하는 쿼리. PrefixQuery는 app *와 같은 입력을 위해 QueryParser에 의해 작성됩니다." – Mikos