>Java >java지도 시간 >색인 생성 및 전체 텍스트 검색을 위한 Lucene 구성과 이미지 및 텍스트 코드에 대한 자세한 설명

색인 생성 및 전체 텍스트 검색을 위한 Lucene 구성과 이미지 및 텍스트 코드에 대한 자세한 설명

黄舟
黄舟원래의
2017-09-06 10:03:011567검색

Lucene


 오픈 소스 전체 텍스트 검색 엔진 툴킷이지만 완전한 전체 텍스트 검색 엔진은 아니지만 전체 텍스트 검색 엔진 아키텍처로 완전한 쿼리 엔진과 인덱스 엔진을 제공하며 텍스트 분석 엔진(2개의 서양 언어, 영어 및 독일어) Lucene의 목적은 소프트웨어 개발자에게 대상 시스템에서 전체 텍스트 검색 기능을 쉽게 구현하거나 이를 기반으로 완전한 전체 텍스트 검색 엔진을 구축할 수 있는 간단하고 사용하기 쉬운 툴킷을 제공하는 것입니다.

장점


(1) 인덱스 파일 형식은 응용 프로그램 플랫폼과 독립적입니다. Lucene은 서로 다른 플랫폼의 호환 시스템이나 응용 프로그램이 생성된 인덱스 파일을 공유할 수 있도록 8비트 바이트 기반 인덱스 파일 형식 집합을 정의합니다.

(2) 기존 전체 텍스트 검색 엔진의 역색인을 기반으로 블록 인덱싱을 구현하여 새 파일에 대한 작은 파일 인덱스를 설정하고 인덱싱 속도를 향상시킬 수 있습니다. 그런 다음 원본 인덱스와의 병합을 통해 최적화 목적이 달성됩니다.

(3) 뛰어난 객체지향 시스템 아키텍처 덕분에 Lucene 확장 기능을 더 쉽게 배울 수 있고 새로운 기능 확장이 용이합니다.

(4) 텍스트 분석 인터페이스는 언어 및 파일 형식과 독립적으로 설계되었습니다. 인덱서는 토큰 스트림을 수용하여 인덱스 파일 생성을 완료합니다. 사용자는 새로운 언어를 확장하고 파일 형식.

(5) 강력한 쿼리 엔진 세트가 기본적으로 구현되었습니다. Lucene의 쿼리 구현은 기본적으로 부울 연산과 퍼지 검색을 구현하기 위해 시스템을 활성화하기 위해 자체 코드를 작성할 필요가 없습니다. ), 그룹 쿼리 등

Concept


먼저 오랫동안 유포되었던 이 사진을 보시면 아시겠지만 제가 알기로는

왼쪽이 컬렉션입니다. 온라인, 텍스트, 데이터베이스 등 다양한 데이터의 잠깐, Lucene을 통해 생성된 인덱스를 수집

오른쪽: 사용자가 검색하고, 인덱스하고, 결과를 반환하는 과정

Lucene 구성


jar 패키지를 도입하고 인덱스 파일을 생성하는 것은 매우 간단합니다

저는 6.6.0 코어 패키지의 최신 버전인 lucene-core-6.6.0.jar를 사용하고 있습니다. 공식 웹사이트 http://lucene.apache.org/에서 다운로드할 수 있습니다. 여기 하나의 패키지로 테스트할 수 있습니다

인덱스 파일은 index입니다. 내부 콘텐츠가 자동으로 생성되므로 부담 없이 이 파일 이름을 선택할 수 있습니다. .색인 디렉터리입니다. 관심이 있으시면 사용해 볼 수 있습니다.

그러나 이 Jar 패키지: IKAnalyzer6.5.0.jar은 중국어를 지원하는 확장 패키지입니다. 단어 분할. 이 두 디렉토리는 src 디렉토리와 동일한 수준에 있습니다. 위의 Lucene 개념 맵에서 먼저 색인을 생성해야 합니다. 실제로 이러한 예외는 처리가 너무 느립니다.

public static void createindex() throws Exception {
        //创建文件目录    创建在项目目录下的index中
        Directory dir=FSDirectory.open(FileSystems.getDefault().getPath(System.getProperty("user.dir")+"/index"));
        //分词处理         是一个抽象类 一种单字分词,标准的
        Analyzer analyzer=new IKAnalyzer();
        //创建IndexWriterConfig对象
        IndexWriterConfig config=new IndexWriterConfig(analyzer);
        //创建IndexWriter对象
        IndexWriter iWriter=new IndexWriter(dir, config);
        //清除之前的索引
        iWriter.deleteAll();
                //创建文档对象
        Document doc=new Document();
        //向文档中添加文本内容字段,及字段类型
        doc.add(new Field("fieldname","坚持到底gl博主的博文,转载请注释出处", TextField.TYPE_STORED));
        //将文档添加到indexWriter中,写入索引文件中
        iWriter.addDocument(doc);
                //关闭写入    
                iWriter.close();        
}

이렇게 실행하면 색인에 콘텐츠 파일이 생성된 것을 볼 수 있습니다

다음으로 색인을 쿼리하고 쿼리해야 할 단어를 전달해 보세요.
public static void search(String string) throws Exception {
    
        Directory dir=FSDirectory.open(FileSystems.getDefault().getPath(System.getProperty("user.dir")+"/search"));
        //打开索引目录的
        DirectoryReader dReader=DirectoryReader.open(dir);
        IndexSearcher searcher=new IndexSearcher(dReader);
        //第一个参数 field值 ,第二个参数用户需要检索的字符串
        Term t=new Term("fieldname",string);
        //将用户需要索引的字符串封装成lucene能识别的内容 
        Query query=new TermQuery(t);
        //查询,最大的返回值10
        TopDocs top=searcher.search(query, 10);
                //命中数,那个字段命中,命中的字段有几个
        System.out.println("命中数:"+top.totalHits);
               //查询返回的doc数组
        ScoreDoc[]    sDocs= top.scoreDocs;   
            for (ScoreDoc scoreDoc : sDocs) {
                //输出命中字段内容
        System.out.println(searcher.doc(scoreDoc.doc).get(field));
}
}

이렇게 전체 텍스트 검색 테스트가 나왔습니다. 더 많이 생각하고 요약하고 확장

한 다음 이해하는 데 도움이 되는 코드를

public static void main(String[] args) throws Exception {
        String chString="坚持到底的文章,转载请注释出处";
        Analyzer analyzer=new IKAnalyzer();
        TokenStream stream=analyzer.tokenStream("word", chString);
        stream.reset();
        CharTermAttribute cta=stream.addAttribute(CharTermAttribute.class);
        while (stream.incrementToken()) {
            System.out.println(cta.toString());
        }
        stream.close();
    }

에 표시합니다.

또한 이러한 파일을 추가할 수도 있습니다. 한 가지 주의할 점은 인코딩 형식에 주의해야 한다는 것입니다.

첫 번째: ext.dic 확장 사전, 단어 분할 다음과 같이 함께 그룹화해야 하는 것: 단어 분할 처리가 분할될 수 있습니다. "끝까지의 끈기"라는 네 단어를 "끝까지의 끈기"와 "끝까지의 끈기"로 이 파일에서 끝까지 끈기를 직접 추가할 수 있으며, 끝까지 끈기의 지수를 표시할 수 있습니다

The 세 번째 : stopword.dic 은 stop 사전을 확장해서 단어분할에서 나타나기를 원하지 않고, 따로 또는 단독으로 나타나기를 원하지 않는다면 거기에 적어주시면 나타나지 않습니다.

두 번째: 위의 두 가지를 지정하세요. 확장된 사전

이것들도 마스터해야 할 가장 기본적인 내용입니다. 또한 확장해야 할 많은 단어 분할 알고리즘이 있습니다

위 내용은 색인 생성 및 전체 텍스트 검색을 위한 Lucene 구성과 이미지 및 텍스트 코드에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.