我正在实现一个非常基本的倒排索引,并且在实现短语搜索方法时遇到了麻烦。
我有以下结构:
InvertedIndex.java:这里我有一个数据结构:
private Map<String, ArrayList<Postings>> index = new HashMap<String, ArrayList<Postings>>();
我在其中存储一个单词和一个包含文档中所有 docId 和相关术语位置的发布列表。
我的 Postings.java 类具有以下结构:
private Map<String, ArrayList<Integer>> postings;
我有所有这些数据结构的 getter 和 setter,所以我不包括它们,因为这对这篇文章来说太多了。该字符串是 docId,而 Arraylist 保存一个单词在文档中的所有位置。
我有一个类,我正在实现以下按短语搜索的方法:
public ArrayList<String> searchByPhrase(String...terms){
if (terms == null || terms.length < 2){
return null;
}
ArrayList<String> documents = new ArrayList<String>();
for (int i = 0; i < terms.length; i++){
ArrayList<Postings> postings1 = index.getPostings(terms[i]);
if ((i + 1) < terms.length){
ArrayList<Postings> postings2 = index.getPostings(terms[i+1]);
int smaller = 0;
if (postings2.size() < postings1.size()){
smaller = postings2.size();
}
else {
smaller = postings1.size();
}
for (int j = 0; j < smaller; j++){
Postings p1 = postings1.get(j);
Postings p2 = postings2.get(j);
if (p1.containsID(p2.getDocId())){
System.out.println("FOUND MATCHING DOC");
//Do position checking in here
}
}
}
}
return documents;
}
我知道在这种方法中,我必须检查位置是否彼此相距一个点。我还没有实现它,因为我希望首先能够找到相同的文档(目前还没有这样做)。当我运行它时,我什么也得不到,而且我有各种我知道的共享单词的文档。
我希望这种方法能够搜索各种大小的术语(“hello world”、“非常感谢您的帮助”等......)。我觉得我把这件事复杂化了,但我对如何解决它非常迷茫。任何建议,将不胜感激。