这几天一直在研究Lucene索引,遇到一些问题,搞得我头都大了.我不知道别人是怎么做的.
开始时,我是把内容读取出来,直接索引在索引文件里,这样就方便在查询时读取内容并高亮显示.但是给果发现,这个东西很受字符编码的影响,于是,我就在文件读取时加上一个编码,可是发现中文检索不出来.
我是这样做的,索引文件contents:
doc.add(new Field("contents", new FileReader(file)));
结果这样做导致问题的出现,原来FileReader读取文件内容时是采取的系统编码,这样就导致UTF-8的文件可能以GBK方式读取进来(因为我发现GBK的没出现问题)进行索引,结果导致在检索时,检索不到.
后来,我就换了一个:
doc.add(new Field("contents", FileDocument.readFileContents(file.getCanonicalPath(), charset), Field.Store.YES, Field.Index.TOKENIZED));
其中readFileContents是我自己写的按照charset编码读取文件内容的函数.这样做能解决索引的问题.但是,这样索引是把文件内容都写到索引中,会导致索引文件很大很大,也就会增加索引时的负担.所以,我还是放弃这样的解决办法了.
回过来继续使用前一个索引方案,但是对它进行改进.后来想想,我只要把doc.add(new Field("contents", new FileReader(file)));里的第二个参数FileReader,让他能以相应的编码来加载文件就可以了.于是我看了一下FileReader的构造函数,没有带编码的构造函数.怎么办.迷惑之中,我尝试用InputStreamReader类实例来代替FileReader,没想到,结果居然能成功,代码如下:
doc.add(new Field("contents", new InputStreamReader(new FileInputStream(file.getCanonicalPath()), charset)));
====================
这样下来,问题就解决了.同时还发现,使用第一种方法,我这里索引了一个文件,结果那个索引文件为98K,第二个方法生成的索引文件150多K,而第三个方法生成的索引文件只有58K,不知道这是为什么,不管了,反正问题解决了就好了.
----------------------
对于Field(String name, Reader reader)和 Field(String name, Reader reader, Field.TermVector termVector)
他们是Field.Index.TOKENIZED和Field.Store.NO的。这就是为什么我们在上面的例子中会出现文章的内容为null了。因为它只是被索引了,而并没有被存储下来。如果一定要看到文章的内容的话可以通过文章的路径得到毕竟文章的路径是作为搜索的附属物被搜索出来了。而我们在Web开发的时候一般是将大数据放在数据库中,不会放在文件系统中,更不会放在索引目录里,因为它太大了操作会加大服务器的负担。
Tags: FileReader Lucene InputStreamReader 索引 搜索引擎 |
原创文章如转载,请注明:转载自:巴士飞扬-技术BLOG : http://www.busfly.net/
本文链接地址:http://www.busfly.net/post/FileReader-lucene-InputStreamReader-Field.html
如果你喜欢本文,请顶一下,支持我,你的支持是我继续发好文章的最大动力。谢谢。
好东西需要分享,快把本文发给你的朋友吧~!~