lucene3.0+版本中文分词测试+搜索结果+创建索引测试

lucene3.0+版本中文分词测试+搜索结果+创建索引测试

  1. import java.io.File;
  2. import java.io.IOException;
  3. import java.io.StringReader;
  4. import org.apache.lucene.analysis.Analyzer;
  5. import org.apache.lucene.analysis.TokenStream;
  6. import org.apache.lucene.analysis.tokenattributes.TermAttribute;
  7. import org.apache.lucene.document.Document;
  8. import org.apache.lucene.document.Field;
  9. import org.apache.lucene.document.Field.Index;
  10. import org.apache.lucene.document.Field.Store;
  11. import org.apache.lucene.index.CorruptIndexException;
  12. import org.apache.lucene.index.IndexWriter;
  13. import org.apache.lucene.index.IndexWriter.MaxFieldLength;
  14. import org.apache.lucene.queryParser.ParseException;
  15. import org.apache.lucene.queryParser.QueryParser;
  16. import org.apache.lucene.search.IndexSearcher;
  17. import org.apache.lucene.search.Query;
  18. import org.apache.lucene.search.ScoreDoc;
  19. import org.apache.lucene.search.TopDocs;
  20. import org.apache.lucene.search.highlight.Highlighter;
  21. import org.apache.lucene.search.highlight.InvalidTokenOffsetsException;
  22. import org.apache.lucene.search.highlight.QueryScorer;
  23. import org.apache.lucene.search.highlight.SimpleFragmenter;
  24. import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
  25. import org.apache.lucene.store.FSDirectory;
  26. import org.apache.lucene.store.LockObtainFailedException;
  27. import org.apache.lucene.util.Version;
  28. import org.wltea.analyzer.lucene.IKAnalyzer;
  29. public class AnalzyerTest {
  30. /**
  31. * lucene3.0开始已经抛弃了原来的分词方式,转而使用新的分词方式<br>
  32. * 本方法以SmartChineseAnalyzer为例,演示如何分词以及取得分词之后的term
  33. * http://blog.csdn.net/yjflinchong/article/details/7906116
  34. * @throws Exception
  35. */
  36. public static void analysis() throws Exception {
  37. Analyzer analyzer = new IKAnalyzer();
  38. String string = "据外媒报道,菲律宾国防部长加斯明9日称,多种新式战机、船只将于年内陆续交付军方,菲国防实力将得到大幅增强。但加斯明同时强调,此次军备采购与黄岩岛争端无关。";
  39. StringReader reader = new StringReader(string);
  40. TokenStream ts = analyzer.tokenStream("", reader);
  41. TermAttribute termAttribute = ts.getAttribute(TermAttribute.class);
  42. while (ts.incrementToken()) {
  43. System.out.println(termAttribute.term() + "  ");
  44. }
  45. System.out.println();
  46. }
  47. /**
  48. * 建索引
  49. * 在构造IndexWriter时必须使用Directory作为参数了
  50. *
  51. * @throws CorruptIndexException
  52. * @throws LockObtainFailedException
  53. * @throws IOException
  54. */
  55. private static void build() throws CorruptIndexException, LockObtainFailedException, IOException {
  56. String path = "index";
  57. IndexWriter writer = new IndexWriter(FSDirectory.open(new File(path)), new IKAnalyzer(), true, MaxFieldLength.LIMITED);
  58. Document document = new Document();
  59. document.add(new Field("text", "中国人民银行采取了一系列措施防止人民币升值,但是很遗憾,这些措施在今天看来其作用是微乎其微的。难道真的就没有什么别的措施防止人民币再次疯狂升值了吗?", Store.YES, Index.ANALYZED));
  60. writer.addDocument(document);
  61. writer.optimize();
  62. writer.close();
  63. }
  64. /**
  65. *
  66. * @param keyword
  67. * @throws CorruptIndexException
  68. * @throws IOException
  69. * @throws ParseException
  70. * @throws InvalidTokenOffsetsException
  71. */
  72. private static void search(String keyword) throws CorruptIndexException, IOException, ParseException, InvalidTokenOffsetsException {
  73. Analyzer analyzer = new IKAnalyzer();
  74. QueryParser parser = new QueryParser(Version.LUCENE_30, "text", analyzer);
  75. IndexSearcher searcher = new IndexSearcher(FSDirectory.open(new File("index")));
  76. Query query = parser.parse(keyword);
  77. System.out.println(query);
  78. TopDocs topDocs = searcher.search(query, 10);
  79. ScoreDoc[] scoreDocs = topDocs.scoreDocs;
  80. System.out.println("hits:" + topDocs.totalHits);
  81. for (ScoreDoc scoreDoc : scoreDocs) {
  82. Document doc = searcher.doc(scoreDoc.doc);
  83. String text = doc.get("text");
  84. System.out.println(highlight(text, query, analyzer));
  85. }
  86. }
  87. /**
  88. * 高亮关键词
  89. * http://blog.csdn.net/yjflinchong/article/details/7906116
  90. * @param content
  91. *            需要高亮的内容
  92. * @param query
  93. *            搜索时使用的Query对象
  94. * @param analyzer
  95. *            分词器
  96. * @return 高亮之后的文本
  97. * @throws IOException
  98. * @throws InvalidTokenOffsetsException
  99. */
  100. private static String highlight(String content, Query query, Analyzer analyzer) throws IOException, InvalidTokenOffsetsException {
  101. SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("<b>", "</b>");
  102. Highlighter highlighter = new Highlighter(formatter, new QueryScorer(query));
  103. highlighter.setTextFragmenter(new SimpleFragmenter(100));
  104. String resultString = highlighter.getBestFragment(analyzer.tokenStream("", new StringReader(content)), content);
  105. return resultString + "...";
  106. }
  107. public static void main(String[] args) throws Exception {
  108. analysis();
  109. build();
  110. search("人民币 升值");
  111. }
  112. }

版权声明:本文为博主http://www.zuiniusn.com原创文章,未经博主允许不得转载。

时间: 2024-12-10 11:59:42

lucene3.0+版本中文分词测试+搜索结果+创建索引测试的相关文章

我与solr(六)--solr6.0配置中文分词器IK Analyzer

转自:http://blog.csdn.net/linzhiqiang0316/article/details/51554217,表示感谢. 由于前面没有设置分词器,以至于查询的结果出入比较大,并且无法进行正确的高亮显示.现在配置一下分词器来解决相关问题. solr6.0中进行中文分词器IK Analyzer的配置和solr低版本中最大不同点在于IK Analyzer中jar包的引用.一般的IK分词jar包都是不能用的,因为IK分词中传统的jar不支持solr6.0这个高版本的,所以就会发送运行

配置solr4.10.0和中文分词IKAnalyzer

全文索引服务solr搭建.公司最近要用到.我又是个java小白.做环境的什么的不再行.就此几下操作. 大部分是看官方提供的reference.pdf来做的,也google了不少.公司还有个大哥指点....笨的可以. 环境如下 OS: centos6.5 java环境: jdk1.7.0_51 tomcat版本: apache-tomcat-7.0.55 solr版本: solr-4.10.0 中文分词插件: IKAnalyzer2012FF_u1 另需准备mysql-connector-java

【solr】solr5.0整合中文分词器

1.solr自带的分词器远远满足不了中文分词的需求,经查使用最多的分词器是solr是mmseg4j分词器,具体整合大家可以参考 https://github.com/zhuomingliang/mmseg4j 一定要注意版本 2.将这两个包直接拷贝到tomcat下的solr/lib中 3.在solr/java里新建dic目录将词库拷贝进去 4.直接在浏览器http://127.0.0.1:8080/solr即可如下分词结果 ok,分词整合完毕!

elasticsearch中文分词+全文搜索

安装ik中文分词器 我在百度上搜索了下,大多介绍的都是用maven打包下载下来的源码,这种方法也行,但是不够方便,为什么这么说? 首先需要安装maven吧?其次需要下载源码吧?最后需要打包吧? 我直接下载打包好的多方便? 下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases 最上面elasticsearch-analysis-ik-5.5.1.zip就是打包好的,直接下载下来用就行了 下面两个都是源码包,需要用maven

Solr5.0配置中文分词包

Solr中默认的中文分词是用Lucene的一元分词包. 现在说明在Solr5.0中配置Lucene的SmartCN中文分词包. 1,进入Solr的安装目录,我这里是:/root/nutch/solr-5.0.0  把contrib/analysis-extras/lucene-libs/lucene-analyzers-smartcn-5.0.0.jar包复制到solr的启动目录的lib目录下. # cp ./contrib/analysis-extras/lucene-libs/lucene-

mysql数据5.6.0和5.1.7的null字段索引测试

如果保函null字段是数字 is null 和is not null都不走索引 如果保函null字段是字符 is null不走索引 和is not null会走索引 字符类型可以默认'' 数字类型可以默认0 1.数据库为5.6.0版本测试 mysql> select @@version; +------------+ | @@version  | +------------+ | 5.6.10-log | +------------+ 1 row in set (0.00 sec) mysql>

solr8.0 ik中文分词器的简单配置(二)

下载ik分词器,由于是solr8.0,一些ik分词器版本可能不兼容,以下是个人亲测可行的版本 链接:https://pan.baidu.com/s/1_Va-9af-jMcqepGQ9nWo3Q 提取码:0a3y 然后将解压出来的两个jar包放到以下路径: 其它的三个文件放到以下路径: 如果没有classes文件夹就创建一个 然后进行ik分词器的配置,编辑以下路径的managed-schema文件 将以下配置放到后边 <!-- ik分词器 --> <fieldType name=&quo

solr 7.7.0配置中文分词器的数据类型

1 <dynamicField name="*_is" type="pints" indexed="true" stored="true"/> 2 <dynamicField name="*_s" type="string" indexed="true" stored="true" /> 3 <dynamicField

关于Solr搜索标点与符号的中文分词你必须知道的(mmseg源码改造)

摘要:在中文搜索中的标点.符号往往也是有语义的,比如我们要搜索“C++”或是“C#”,我们不希望搜索出来的全是“C”吧?那样对程序员来说是个噩梦.然而在中文分词工具mmseg中,它的中文分词是将标点与符号均去除的,它认为对于中文来讲标点符号无意义,这明显不能满足我们的需求.那么怎样改造它让它符合我们的要求呢?本文就是针对这一问题的详细解决办法,我们改mmseg的源代码. 关键字:Solr, mmseg, 中文, 分词, 标点, 符号, 语义 前提:Solr(5.0.0版本),mmseg4j(1.