IKAnalyzer 扩展词典(强制分词)

前面说到solr+IKAnalyzer来配置中文分词;在实际中我们有些需求是需要将特定的词作为一个分词来处理,那么我们就需要设置自己的词典

例子:连帽上衣

希望将 “连帽” 作为一个词来处理,并不希望作为 连,帽 来处理


默认分词:



做法:

IKAnalyzer.cfg.xml放到solr的tomcat中:..../webapp/WEB-INF/classes/IKAnalyzer.cfg.xml,并配置 IKAnalyzer.cfg.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">  
<properties>  
	<comment>IK Analyzer 扩展配置</comment>
	<!--用户可以在这里配置自己的扩展字典--> 
	<entry key="ext_dict">/mydict.dic;</entry> 
	 
	 <!--用户可以在这里配置自己的扩展停止词字典-->
	<entry key="ext_stopwords">/ext_stopword.dic</entry> 
	
</properties>

我是将 mydict.dic 文件和 IKAnalyzer.cfg.xml 放在同一个目录,也可以放在别的地方,配置好路径就可以了

mydict.dic 文件中就只有“连帽” 这个词;

经典问题来了:mydict.dic 必须是 utf-8 的无BOM格式编码。

配置好之后重启solr,再次查看分词:


这样连帽就能匹配的到了。

搞了好久,才知道是文件的编码格式不对。我日的,还必须是无BOM格式。


展开阅读全文

IKAnalyzer分词测试不成功!

07-17

lucene是最新版本4.9, demo代码基本没有改动, 但查询结果却不正确rnrn[code=java]rnpublic class IKAnalyzerDemo rn public static void main(String[] args) rn String fieldName = "text";rnrn String text = "IK Analyzer是一个结合词典分词和文法分词的中文分词开源工具包。它使用了全新的正向迭代最细粒度切分算法。";rnrn Analyzer analyzer = new IKAnalyzer(true);rn //Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_4_9);rn rn Directory directory = null;rn IndexWriter iwriter = null;rn IndexReader ireader = null;rn IndexSearcher isearcher = null;rn try rn directory = new RAMDirectory();rnrn IndexWriterConfig iwConfig = new IndexWriterConfig(Version.LUCENE_4_9, analyzer);rn iwConfig.setOpenMode(IndexWriterConfig.OpenMode.CREATE);rn iwriter = new IndexWriter(directory, iwConfig);rnrn Document doc = new Document();rn doc.add(new StringField(fieldName, text, Field.Store.YES));rn iwriter.addDocument(doc);rn iwriter.close();rnrn ireader = DirectoryReader.open(directory);rn isearcher = new IndexSearcher(ireader);rnrn// String keyword = "Analyzer";rn String keyword = "中文分词工具包";rnrn QueryParser qp = new QueryParser(Version.LUCENE_4_9, fieldName, analyzer);rn qp.setDefaultOperator(QueryParser.AND_OPERATOR);rn Query query = qp.parse(keyword);rn System.out.println("Query = " + query);rnrn TopDocs topDocs = isearcher.search(query, 5);rn System.out.println("命中:" + topDocs.totalHits);rnrn ScoreDoc[] scoreDocs = topDocs.scoreDocs;rn for (int i = 0; i < topDocs.totalHits; i++) rn Document targetDoc = isearcher.doc(scoreDocs[i].doc);rn System.out.println("内容:" + targetDoc.toString());rn rn catch (CorruptIndexException e) rn e.printStackTrace();rn catch (LockObtainFailedException e) rn e.printStackTrace();rn catch (IOException e) rn e.printStackTrace();rn catch (ParseException e) rn e.printStackTrace();rn finally rn if (ireader != null) rn try rn ireader.close();rn catch (IOException e) rn e.printStackTrace();rn rn rn if (directory != null) rn try rn directory.close();rn catch (IOException e) rn e.printStackTrace();rn rn rn rn rnrn[/code]rn不管怎么改, 结果总是: rn[code=html]rn命中:0rn[/code]rn不知道问题出在哪里!! 论坛

没有更多推荐了,返回首页