2013-08-23 2 views
0

Lucene에 문제가 있습니다. 누군가 내가 잘못하고있는 생각을 나에게 줄 수 있기를 바랍니다.Lucene이 예상 데이터를 찾지 못했습니다.

저는 lucene 4.4를 사용하고 있으며 StandardAnalyser를 사용하고 있습니다. 한 필드에서 검색을 시도하고 있지만 이상한 결과가 나타납니다.

예를 들어 "gros *"단어를 검색하면 "grossesse"가 포함 된 결과가 반환됩니다. 이것은 잘되고 예상대로입니다. 그러나 "총체적으로"검색하면 아무 것도 발견되지 않습니다.

내가 뭘 잘못하고 있는지 아는 사람이 있습니까? 내가 누락 된 설정이 있습니까? 도움이나 의견을 보내 주시면 감사하겠습니다.

감사

이 내 인덱스

private void createIndex(Analyzer analyzer, String catalogueId, Locale locale, Directory index) throws IOException { 

    IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_44, analyzer); 
    IndexWriter w = new IndexWriter(index, config); 
    Document doc = null; 

    for (ProduitCatalogue produitCatalogue : produitCataloguesMap.get(catalogueId + locale.getLanguage()).values()) { 
     doc = new Document(); 
     doc.add(new IntField("id", produitCatalogue.getId(), Store.YES)); 
     TextField desc = new TextField("description", produitCatalogue.getDescription(), Store.YES); 
     doc.add(desc); 
     w.addDocument(doc); 
    } 

    w.close(); 
    } 
} 

이 내 createQuery입니다

private Query createQuery(String searchTxt, Analyzer analyzer) throws ParseException { 

    QueryParser queryParser = new QueryParser(Version.LUCENE_44, "description", analyzer); 
    queryParser.setAllowLeadingWildcard(true); 
    queryParser.setAutoGeneratePhraseQueries(false);  
    Query q = queryParser.parse(searchTxt); 

    return q; 
} 

이 내 분석이다

Analyzer analyzer = englishAnalyzer; 

if (Locale.CANADA_FRENCH.getLanguage().equals(locale.getLanguage())) { 
    analyzer = frenchAnalyzer; 
} 

Query q = createQuery(searchTxt, analyzer); 
DirectoryReader reader = DirectoryReader.open(indexMap.get(catalogueId + locale.getLanguage())); 
IndexSearcher searcher = new IndexSearcher(reader); 
TopScoreDocCollector collector = TopScoreDocCollector.create(HITS_PER_PAGE, true); 
searcher.search(q, collector); 
ScoreDoc[] hits = collector.topDocs().scoreDocs; 

답변

2

와일드 카드, 퍼지 및 Regex 쿼리와 마찬가지로 접두사 쿼리는 분석기를 통과하지 않습니다. 언어 별 분석기 (EnglishAnalyzerFrenchAnalyzer)를 사용하고 있으므로 분석기를 통해 전달 된 색인 된 데이터가 손상됩니다. 나는 형태소 분석을 한 후에 "grossesse"가 줄기 "gros"로 색인이 붙을 것이라고 추측합니다. 와일드 카드없이 "총체적인"것을 찾는 것은 나는 히트 (나는 확실한 형태로 말하기 위해 적절한 형태소 논리를 넘지 않았다)라고 생각한다.

스테 밍 및 와일드 카드 쿼리를 허용하는 가능한 방법 중 하나는 언어 분석기를 사용하여 줄기를 붙인 것과 다른 줄을 사용하지 않고 StandardAnalyzer을 사용하여 두 필드의 데이터를 인덱싱하는 것입니다. 항상 둘 다 검색하거나 쿼리에 포함 된 내용을 기반으로 선택적으로 검색 할 수 있습니다. 특히 사용자가 입력 한 검색어의 경우 두 필드를 동시에 검색하는 것이 내 마음에 맞는 방법 일 것입니다.

관련 문제