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

来源:互联网 时间:1970-01-01

转载请注明出处: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的自动填充插件则可以完成自动补全功能



相关阅读:
Top