2011-01-13 3 views
0

최대 절전 모드 검색을 사용하고 있습니다. 문제는 내가 검색이 문자열을 수행 할 때이다 :최대 절전 모드 검색 : 토큰없는 쿼리

"L"

을 내가없는 결과를 ...이 나는 ...이 함께

"리터 *"

을 시도하는 경우

결과는 다음과 같습니다

"Lampada 어쩌구 저쩌구" "람 피오 네 섬 어쩌구 어쩌구 저쩌구" "로스트"

티 의 내 POJO입니다

@Id @GeneratedValue 
@DocumentId 
private Long id; 

@Field(index=Index.TOKENIZED, store=Store.YES) 
private String nome; 

@Field(index=Index.TOKENIZED,store=Store.YES, termVector=TermVector.YES) 
private String descrizione; 

@Column(length=30) 
public String getNome() { 
    return nome; 
} 
public void setNome(String nome) { 
    this.nome = nome; 
} 

@Column(length=100) 
public String getDescrizione() { 
    return descrizione; 
} 
public void setDescrizione(String descrizione) { 
    this.descrizione = descrizione; 
} 
public Long getId() { 
    return id; 
} 
public void setId(Long id) { 
    this.id = id; 
} 

@Override 
public String toString() { 
    return String.format("(%s) %s: %s", id, nome, descrizione); 
} 

이 내 자바 클래스입니다 :

Session session = super.session(); 
    List result = new ArrayList(); 
    luceneSession = Search.getFullTextSession(session); 

    String[] fields = (String[]) boostsNField.keySet().toArray(new String[boostsNField.keySet().size()]); 

    QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_30, fields, new StandardAnalyzer(Version.LUCENE_30), boostsNField); 
    StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_30); 


    try { 
     Query luceneQuery = parser.parse(queryString); 
     org.hibernate.Query fullTextQuery = luceneSession.createFullTextQuery(luceneQuery); // E' possibile scegliere impostare il class da ricercare 
     result = fullTextQuery.list(); 

    } catch (ParseException e) { 

문제가?!?!?

+0

더 자세히 알려 줄 수 있습니까? 특히 다음과 같습니다. 현재 데이터 쿼리가 예상되는 출력, 현재 출력되고 있습니다. –

답변

1

아마도 StandardAnalyzer를 사용하여 문서를 색인화 할 수 있습니다. javadoc에 따르면, 을 사용합니다. 이 토크 나이 저는 텍스트에서 단어를 추출하고 몇 가지 간단한 규칙 (javadoc 읽기)으로 처리합니다. 토큰의 일부 필터링이 발생하지만 일반적으로 단어는 토큰이됩니다.

세부 사항은 모르겠지만 검색 할 때 lucene은 토큰 (사례의 단어)을 비교/검색하므로 "l"토큰이 동일하지 않기 때문에 "l"결과는 빈 목록으로 나타납니다 "Lampada"토큰으로.

색인 된 문서의 하위 문자열을 사용하여 색인을 검색하려면 ngrams()를 기반으로 토큰 화 프로그램을 사용하거나 쓰는 것이 좋습니다. 주어진 문자열의 가능한 모든 하위 문자열에 대해 토큰을 생성합니다. "Lampada"를 문자열로 사용하면 LuceneIndex를 StandardTokenizer 및 query = "l"로 큐잉 할 때도 "L", "La", "Lam", ..., "ada", "da" "일치하는 문서를 찾을 수 있습니다 (이 방법이 색인이 증가하는 속도를 증가 시킨다는 것을 알고 있어야합니다).

+0

StandardTokenizer는 Analyzer의 하위 클래스가 아닙니다. MultiFieldPartQueryParser에는 분석기가 필요합니다. 아마도 Analyzer의 하위 클래스 인 StandardTokenizer를 사용하십시오. –

+0

물론 아닙니다. Luigi, 쿼리에서 사용하는 분석기가 문서를 색인하는 데 사용되는 Analyzer에 의해 생성 된 토큰과 일치하는지 ("l"은 "Lampada"와 일치하지 않지만 "l *"는 일치 함) 확인하십시오. –