자바 검색엔진 "아파치 루씬(lucene) 8.7.0" 적용기 - 1/2

2021. 1. 20. 10:54Development/[Java] 자바

728x90

아파치 루씬은 보통 여러 파일을 인덱싱하여 해당 파일을 빠르게 찾는 용도의 레퍼런스가 많이 나와있으나,

현재 도전중인 것은 파일 1개안의 텍스트들을 행단위로 인덱싱하고 빠르게 찾기 위해 시도중이다.

허나 아래의 코드로 했을 경우, 단어를 찾지 못하고 있다.

try {

                File file = new File("인덱스가생길디렉토리명칭.index");
                Directory dir = FSDirectory.open(Paths.get(file.toURI()));
                Analyzer analyzer = new StandardAnalyzer();
                IndexWriterConfig iwc = new IndexWriterConfig(analyzer);

                iwc.setOpenMode(IndexWriterConfig.OpenMode.CREATE);

                IndexWriter writer = new IndexWriter(dir, iwc);
                LineNumberReader lineNumberReader = 파일스트림;
                lineNumberReader.lines().forEach(s -> {

                    try {
                        int line = lineNumberReader.getLineNumber();
                        Document doc = new Document();
                        doc.add(new TextField("id", String.valueOf(line), Field.Store.YES));
                        doc.add(new TextField("word", s, Field.Store.YES));
                        writer.addDocument(doc);
                    } catch (IOException ioException) {
                        ioException.printStackTrace();
                    }
                });

                writer.close();

                DirectoryReader ireader = DirectoryReader.open(dir);
                IndexSearcher searcher = new IndexSearcher(ireader);

                QueryParser qp = new QueryParser("word", analyzer);
                qp.setDefaultOperator(QueryParser.Operator.AND);
                Query query = qp.createPhraseQuery("word","찾을단어");
                TopDocs hits = searcher.search(query, 10);

                if(hits == null || hits.totalHits == null || hits.scoreDocs == null || hits.scoreDocs.length == 0) {
                    System.out.println("Cannot Find");
                }
                for (ScoreDoc sd : hits.scoreDocs)
                {
                    Document d = searcher.doc(sd.doc);
                    System.out.println("Find Word: "+d.get("word"));
                }

            } catch (IOException e) {
                System.out.println("Lucene Exception :: ");
            }

 

위 시도는..

현재 [ 기존 파일 > 특정 단어들이 들어간 라인들만 추려내여 > 신규 파일 작성 ] 이라는 일련의 과정을 진행하고 있는데,

자바 NIO의 파일 입출력 방식, 고전적인 IO방식으로 파일을 작성하는 것은 둘째 문제이고, 우선 기존의 60여만줄의 텍스트 파일안의 내용을 빠르게 검색해야하는 로직을 구상해야한다.

이에 병렬처리로 쓰레드가 12~15개 정도 생성된 상태로 찾기를 수행해도 시간이 매우 오래걸리고 있다.

- 계속 -

2편(완결) - kplog.tistory.com/286

 

728x90