Lucene之——获取索引关键字给Jquery自动填充框架使用

来源:互联网 发布:javascript面试 编辑:程序博客网 时间:2024/06/01 08:58

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/49624703

通过Lucene的lukeall-1.0.0.jar  通过 java –jar lukeall-1.0.0.jar 可以通过界面的方式可以看到索引库的所有信息截图如下:

但是现在我们需要获取合适的Term,然后通过命中率排序, 最后的结果转化为 JSON格式交给Jquery的自动填充框架如何实现呢?

Lucene中有个IndexSearcher:此类是用来根据Query查询语句来查询的类. 除了此类外. Lucene还有一个IndexReader类. 此类可以获取所有的索引源码如下:

private static IndexReader reader = null;static {try {reader = IndexReader.open(FSDirectory.open(new File("D:\\workspace\\lucene3\\indexData")));} catch (Exception e) {throw new RuntimeException(e);}}// 返回所有的关键词Termpublic static TermEnum getAllTerm() {try {return reader.terms(); // reader.terms(term); 这个方法是无效的,看源码就清楚了} catch (IOException e) {throw new RuntimeException(e);}}

其实IndexReader是一个抽象类 通过API查看如下:

public abstract class IndexReader 其中还有一个reader.terms(term);方法,此方法是抽象方法.可以用来过滤的,但是我们可以看到在IndexReader下面还有个FilterIndexReader子类 通过名字可以看出是个过滤的查询类 但是通过源码我们可以看到它的确实现了 terms(term) 这个方法, 但是我们查看源码会发现.此方法没有做任何操作还是调用了term() 所以我们有两个选择 第一:继承FilterIndexReader 或者IndexReader 重写term()方(根据尽量避免使用继承的原则我们不推荐) 第二自己在独立写个过滤的方法

所以我们可以看到过滤的源码:

public static KeyWord[] getContintTerm(Term term) {try {return FilterTerm(reader.terms(), term);} catch (IOException e) {throw new RuntimeException(e);}}// 由于不但要能存储Term也需要存储频率所以可以自定一个keyWord类型private static KeyWord[] FilterTerm(TermEnum enums, Term term) {List<KeyWord> terms = new ArrayList<KeyWord>();boolean isHave = false;try {isHave = enums.next();while (isHave) {            if (Pattern.matches("(\\w|[\u4E00-\u9FA5])*" + word + "(\\w|[\u4E00-\u9FA5])*", temp.text())) {KeyWord keyWord = new KeyWord(enums.term().text(), enums.docFreq());terms.add(keyWord);}isHave = enums.next();}} catch (IOException e) {throw new RuntimeException(e);}return SortKeyWord(terms.toArray(new KeyWord[terms.size()]));}
把关键字查询出来之后 需要排序所以编写了一个对数组排序的冒泡算法
private static KeyWord[] SortKeyWord(KeyWord[] keywords) {for (int i = 0; i < keywords.length - 1; i++) {for (int j = i + 1; j < keywords.length; j++) {if (keywords[i].getNumber() < keywords[j].getNumber()) {KeyWord temp = keywords[i];keywords[i] = keywords[j];keywords[j] = temp;}}}return keywords;}

如果你输入h 可以得到如下结果:

[DEBUG] 关键字为:hp 搜索的结果为: 46[DEBUG] 关键字为:hello 搜索的结果为: 9

最后把得到的关键字转化为json格式交给Jquery的自动填充插件则可以完成自动补全功能

1 0
原创粉丝点击