初識lunece(同義詞檢索)

1.首先建立索引java

package com.sunmap.analyzer;

import java.io.File;
import java.io.IOException;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;

/**
 *    建立索引
 */
public class MyIndexer {
    public static void createIndex(String indexPath) throws IOException {
        Directory directory = FSDirectory.open(new File(indexPath));
        Analyzer analyzer = new IKAnalyzer();

        IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_46,
                analyzer);
        IndexWriter indexWriter = new IndexWriter(directory, config);
        Document document1 = new Document();
        document1.add(new TextField("title", "thinkpad超極本筆記本中的戰鬥機", Field.Store.YES));
        indexWriter.addDocument(document1);

        Document document2 = new Document();
        document2.add(new TextField("title", "用戶能夠在這裏配置本身的擴展字典", Field.Store.YES));
        indexWriter.addDocument(document2);

        Document document3 = new Document();
        document3.add(new TextField("title", "您能夠參考分詞器源碼", Field.Store.YES));
        indexWriter.addDocument(document3);

        Document document4 = new Document();
        document4.add(new TextField("title","第一臺計算機是美國軍方定製,專門爲了計算彈道和射擊特性表面而研製的,承擔開發任務的「莫爾小組」由四位科學家和工程師埃克特、莫克利、戈爾斯坦、博克斯組成。1946年這臺計算機主要元器件採用的是電子管。該機使用了1500"
                                + "個繼電器,18800個電子管,佔地170m2,重量重達30多噸,耗電150KW,造價48萬美圓。這臺計算機每秒能完成5000次加法運算,400次乘法運算,比當時最快的計算工具快300倍,是繼電器計算機的1000倍、手工計算的20萬倍。"
                                + "用今天的標準看,它是那樣的「笨拙」和「低級」,其功能遠不如一隻掌上可編程計算器,但它使科學家們從複雜的計算中解脫出來,它的誕生標誌着人類進入了一個嶄新的信息革命時代。",
                                Field.Store.YES));
        indexWriter.addDocument(document4);
        indexWriter.close();
    }
}

2.建立一個檢索類:apache

package com.sunmap.analyzer;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;

public class MySearcher {
    public static List<String> searchIndex(String keyword, String indexPath)
            throws IOException, ParseException {
        List<String> result = new ArrayList<>();
        IndexSearcher indexSearcher = null;
        IndexReader indexReader = DirectoryReader.open(FSDirectory
                .open(new File(indexPath)));
        indexSearcher = new IndexSearcher(indexReader);
        Analyzer analyzer = new IKAnalyzer();
        QueryParser queryParser = new QueryParser(Version.LUCENE_46, "title",analyzer);
        Query query = queryParser.parse(keyword);
        TopDocs td = indexSearcher.search(query, 10);
        for (int i = 0; i < td.totalHits; i++) {
            System.out.println(td.scoreDocs[i].score);
            Document document = indexSearcher.doc(td.scoreDocs[i].doc);
            result.add(document.get("title"));
        }
        return result;
    }
}

3.同義詞檢索:編程

package com.sunmap.analyzer;

import java.io.IOException;
import java.io.StringReader;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.core.WhitespaceAnalyzer;
import org.apache.lucene.analysis.synonym.SynonymFilterFactory;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.util.FilesystemResourceLoader;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.core.IKSegmenter;
import org.wltea.analyzer.core.Lexeme;
import org.wltea.analyzer.lucene.IKAnalyzer;

public class AnalyzerUtil {

    /**
     * 
     * 此方法描述的是:進行中文拆分
     */
    public static String analyzeChinese(String input, boolean userSmart)
            throws IOException {
        StringBuffer sb = new StringBuffer();
        StringReader reader = new StringReader(input.trim());
        IKSegmenter ikSeg = new IKSegmenter(reader, userSmart);// true 用智能分詞 ,false細粒度
        for (Lexeme lexeme = ikSeg.next(); lexeme != null; lexeme = ikSeg
                .next()) {
            sb.append(lexeme.getLexemeText()).append(" ");
        }
        return sb.toString();
    }

    /**
     * 
     * 此方法描述的是:對傳入的字符串進行同義詞匹配,返回有同義詞的TokenStream
     */
    public static TokenStream convertSynonym(String input) throws IOException {
        Version ver = Version.LUCENE_46;
        Map<String, String> filterArgs = new HashMap<String, String>();
        filterArgs.put("luceneMatchVersion", ver.toString());
        //同義詞詞庫位置
        filterArgs.put("synonyms", "config/synonyms.txt");
        filterArgs.put("expand", "true");
        
        
        
        SynonymFilterFactory factory = new SynonymFilterFactory(filterArgs);
        factory.inform(new FilesystemResourceLoader());
        Analyzer ikAnalyzer = new IKAnalyzer();
        TokenStream ts = factory.create(ikAnalyzer.tokenStream("someField", input));
        return ts;
    }

    /**
     * 
     * 此方法描述的是:將tokenstream解析成字符串
     */
    public static String displayTokens(TokenStream ts) throws IOException {
        StringBuffer sb = new StringBuffer();
        CharTermAttribute termAttr = ts.addAttribute(CharTermAttribute.class);
        ts.reset();
        while (ts.incrementToken()) {
            String token = termAttr.toString();
            sb.append(token);
        }
        ts.end();
        ts.close();
        return sb.toString();
    }

    public static void main(String[] args) {
        
        String indexPath = "/home/share/study/index_test";
        String input = "電腦";
        System.out.println("**********************");
        try {
            String result = displayTokens(convertSynonym(analyzeChinese(input,
                    true)));
            /**
             * 
             * 注意這塊
             * 同義詞檢索就是把將要檢索的詞變成它的同義詞和本身的合成詞進行檢索
             * 
             * */
            System.out.println(result);
//            String result = input;
//            MyIndexer.createIndex(indexPath);
            List<String> docs = MySearcher.searchIndex(result, indexPath);
            for (String string : docs) {
                System.out.println(string);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

輸出結果:app

**********************
加載擴展詞典:ext.dic
加載擴展中止詞典:stopword.dic
超極本計算機電腦
0.17161283
0.087962404
thinkpad超極本筆記本中的戰鬥機
第一臺計算機是美國軍方定製,專門爲了計算彈道和射擊特性表面而研製的,承擔開發任務的「莫爾小組」由四位科學家和工程師埃克特、莫克利、戈爾斯坦、博克斯組成。1946年這臺計算機主要元器件採用的是電子管。該機使用了1500個繼電器,18800個電子管,佔地170m2,重量重達30多噸,耗電150KW,造價48萬美圓。這臺計算機每秒能完成5000次加法運算,400次乘法運算,比當時最快的計算工具快300倍,是繼電器計算機的1000倍、手工計算的20萬倍。用今天的標準看,它是那樣的「笨拙」和「低級」,其功能遠不如一隻掌上可編程計算器,但它使科學家們從複雜的計算中解脫出來,它的誕生標誌着人類進入了一個嶄新的信息革命時代。工具

同義詞詞庫synonyms.txt內容:spa

我,俺,hankcs
似,is,are => 是
好人,好心人,熱心人
超極本,計算機,電腦code

 

好人,好心人,熱心人orm

表明同義詞;blog

似,is,are => 是索引

似,is,are 能夠轉意爲是;

相關文章
相關標籤/搜索