Lucene Chinese Analyzer Jcseg使用相同的代码可以得到不同的结果

时间:2016-09-06 02:26:33

标签: java lucene analyzer

使用EJB3.0 + jersey restful API + lucene 6.1

分析仪是Jcseg中文分析仪。

代码:

@Stateless
public class GoodsSearchBiz implements Serializable {

@Override
public List<String> test(){

Analyzer analyzer = new JcsegAnalyzer5X(JcsegTaskConfig.SEARCH_MODE);
JcsegAnalyzer5X jcseg = (JcsegAnalyzer5X) analyzer;
JcsegTaskConfig config = jcseg.getTaskConfig();
config.setAppendCJKSyn(true);
config.setAppendCJKPinyin(true);

TokenStream stream = null;
List<String> strList = new ArrayList<>();
try {
    FSDirectory directory = FSDirectory.open(Paths.get(ResourcesUtils.loadGoodsMarketIndexDir()));
    IndexWriterConfig iwConfig = new IndexWriterConfig(analyzer);
            iwConfig.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);
    IndexWriter iwriter = new IndexWriter(directory, iwConfig);
    iwriter.deleteAll();

    String words = "中华人民共和国";

    Document doc = new Document();
    doc.add(new TextField(SearchGoodsVO.FIELD_NAME, words, Field.Store.YES));
    iwriter.addDocument(doc);
    iwriter.commit();
    iwriter.close();

    stream = analyzer.tokenStream(SearchGoodsVO.FIELD_NAME, words);
    stream.reset();
    CharTermAttribute offsetAtt = stream.addAttribute(CharTermAttribute.class);
    while (stream.incrementToken()) {
        strList.add(offsetAtt.toString());
    }
    stream.end();
    if (stream != null) stream.close();
} catch (Exception e) {
    e.printStackTrace();
}
System.out.println(strList);
return strList;

}

在Main中运行它会产生不同的结果

    public static void main(String[] args) {
        GoodsSearchBiz goodsSearchBiz = new GoodsSearchBiz();
        goodsSearchBiz.test();
    }
}


/*The Api*/
@Path("/search")
@Produces(RestMediaType.JSON_HEADER)
@Consumes(RestMediaType.JSON_HEADER)
public class GoodsSearchApi {

    @EJB
    GoodsSearchBiz searchBiz;

     @GET
    @Path("/test")
    public List<String> test() {
        return searchBiz.test();
    }
}

结果:

来自Main的

[中华, 中华人民共和国, 华人, 人民, 人民共和国, 共和, 共和国]
Process finished with exit code 0

来自API:

09:31:05,433 INFO  [stdout] (default task-1) [中, 华, 人, 民, 共, 和, 国]

为什么相同的代码会给出不同的结果?

1 个答案:

答案 0 :(得分:-2)

你必须让jcseg加载它的词典。

在你的api模式下,Jcseg没有正确加载词典。

如果您能阅读中文,请访问https://github.com/lionsoul2014/jcseg获取更多帮助