Поиск фразы в перевернутом индексе
Я реализую очень элементарный инвертированный индекс, и у меня возникают проблемы с реализацией метода поиска по фразе.
У меня есть следующая структура:
InvertedIndex.java: здесь у меня есть структура данных:
private Map<String, ArrayList<Postings>> index = new HashMap<String, ArrayList<Postings>>();
где я храню слово и список публикаций со всеми docId и соответствующими позициями терминов в документе.
Мой класс Postings.java имеет следующую структуру:
private Map<String, ArrayList<Integer>> postings;
У меня есть геттеры и сеттеры для всех этих структур данных, поэтому я не включаю их, потому что это будет слишком много для этого поста. Строка - это 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;
}
Я знаю, что в рамках этого метода я должен проверить, чтобы позиции находились в одном месте друг от друга. Я еще не реализовал это, потому что сначала хочу найти одинаковые документы (чего сейчас нет). Когда я запускаю это, я ничего не возвращаю, и у меня есть различные документы, которые я знаю, разделяю слова.
Я хочу, чтобы этот метод мог искать термины разных размеров ("Привет, мир", "Большое спасибо за вашу помощь" и т. Д....). Я чувствую, что я слишком усложняю это, но я очень потерян, как справиться с этим. Мы ценим любые предложения.