2017-11-12 3 views
0

Lucene으로 자동 완성 기능을 구현하려고합니다. 예를 들어, 사용자가 "Lucene"을 입력하면 반환 된 결과는 "Lucene In Action"및 "Lucene for Dummies"일 수 있습니다.lucene에서 엄격한 접두사 찾기

내가 겪고있는 문제는 필드가 검색된 텍스트로 시작해야한다는 것인데, 중간에 어딘가에 있으면 안됩니다. "Lucene"을 검색하면 "Enterprise Lucene"이 반환되지 않습니다. 여기까지 제 코드는 위의 코드를 제외하고 있습니다 :

StandardAnalyzer analyzer = new StandardAnalyzer(); 
    Directory index = new RAMDirectory(); 
    IndexWriterConfig config = new IndexWriterConfig(analyzer); 

    IndexWriter indexWriter = new IndexWriter(index, config); 
    addDocument(indexWriter, "Luceneinaction"); 
    addDocument(indexWriter, "LuceneforDummies"); 
    addDocument(indexWriter, "WhyisLucenesohard"); 
    addDocument(indexWriter, "Managing Gigabytes"); 
    addDocument(indexWriter, "The Art of Computer Science"); 
    indexWriter.close(); 

    Query query = new PrefixQuery(new Term("title", "lucene")); 

    IndexReader reader = DirectoryReader.open(index); 
    IndexSearcher searcher = new IndexSearcher(reader); 
    TopDocs docs = searcher.search(query, 10); 
    for (ScoreDoc scoreDoc : docs.scoreDocs) { 
     System.out.println(searcher.doc(scoreDoc.doc).get("title")); 
    } 

쉬운 해결책이 있습니까? PrefixQuery는 StringField와 호환되지 않으므로 공백으로 분리되지 않는 토크 나이저를 찾을 수 없습니다.

답변

0

solr의 텍스트 필드를 인덱싱하면 토큰 화됩니다. 예를 들어 공백 토큰 화 도구는 향의 각 공간에 문서를 분할합니다. 따라서 문자열 위치를 기반으로 검색하지 못할 수도 있습니다.

사용 사례에 따라 텍스트 대신 텍스트 형식 (키워드 토큰 기능 사용)으로이 필드를 복사하거나 저장해야합니다. 그런 다음 solr 저장소를 전체 문자열을 단일 문자열로 저장하여 정규식 검색을 수행 할 수 있습니다.

0

Fulltext-Search에 필드를 사용하려면이 필드가 분석되기 때문에 항상 Textfield를 사용해야합니다 (제공된 분석기 기반). 다음의 javadoc을 참조하십시오. Field

어떤 용도로 사용해야 하는지를 이해하는 것이 중요합니다.

TextField에서 검색 할 경우 PrefixQuery를 사용할 필요가 없습니다.