Commit 8c9162ba authored by Christian Reuschling's avatar Christian Reuschling
Browse files

bugfix: frequencies in auto completion now correct

parent a645bb6e
......@@ -5,8 +5,14 @@ package org.dynaq.search.pull.attrepresentation;
import de.dfki.inquisitor.text.StringUtils;
import org.apache.lucene.analysis.core.KeywordAnalyzer;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.TermQuery;
import org.dynaq.index.LuceneIndexSet;
import org.dynaq.util.lucene.FieldFactory;
import org.dynaq.util.lucene.basic.IndexAccessor;
import org.dynaq.util.lucene.basic.RemoteIndexSearcher;
import org.dynaq.util.lucene.basic.Term2FrequencyEntry;
import javax.swing.*;
......@@ -340,30 +346,27 @@ public class AutoCompleteKeyListener extends KeyAdapter
return;
String strUserTerm = lastTagBeforeCaret.group();
// if(strUserTerm == null || strUserTerm.isEmpty()) return;
Logger.getLogger(AutoCompleteKeyListener.class.getName()).finest("Actual tag: \"" + strUserTerm + "\"");
int iHardCodedListLength = 7;
// wir haben mit getAllTermsWithPrefix keine korrekten Zahlen für die docFrq gekriegt - ich nehme an, da fehlt ein optimize(), das man gar nicht mehr machen soll
// (wenn das noch aktuell ist) aus diesem Grund stoßen wir noch eine Suche an:
TreeMap<String, Integer> tmAllFieldTerms = new TreeMap<String, Integer>();
for (String strFieldName : m_lIndexAttNames4TermCompletion)
{
// TODO hier kommen falsche Frequenzen zurück. Vielleicht doch besser mit einer Query. Die Terme passen, erst Terme wie gehabt ermitteln und dann die Anzahl
// nochmal mit der Query. Sortierung wird grob passen wie sie zurück kommt
List<Term2FrequencyEntry> lTerm2Frq = m_luceneIndexSet.getAllTermsWithPrefix(strFieldName, strUserTerm, iHardCodedListLength);
// wenn wir mehrere Attribute haben, dann kann ich über die DocFreq keine Aussage mehr treffen - wir machen ein ~ hin,
// und tragen den Maximalwert ein (und zwar als negativen Betrag, um ihn als solchen zu markieren)
for (Term2FrequencyEntry term2DocFreq : lTerm2Frq)
{
// wir kriegen hier keine korrekten Zahlen - ich nehme an, da fehlt ein optimize(), das man gar nicht mehr machen soll (wenn das noch aktuell ist)
// aus diesem Grund stoßen wir noch eine Suche an:
gcnjx
// wenn wir schon einen haben, tragen wir den Maximalwert ein. Um zu markieren, ob es ein Maximalwert ist, nehmen wir den negativen Betrag
tmAllFieldTerms.merge(term2DocFreq.getTerm(), term2DocFreq.getFrequency(), (a, b) -> Math.max(Math.abs(a), b) * -1);
}
}
RemoteIndexSearcher searcher = IndexAccessor.getMultiIndexSearcher(m_luceneIndexSet.getIndexPaths());
m_lIndexAttNames4TermCompletion.stream().flatMap(strFieldName -> m_luceneIndexSet.getAllTermsWithPrefix(strFieldName, strUserTerm, iHardCodedListLength).stream())
.map(Term2FrequencyEntry::getTerm).forEach(strTerm -> {
BooleanQuery booleanQuery4Term = new BooleanQuery();
for (String strFieldName : m_lIndexAttNames4TermCompletion)
booleanQuery4Term.add(new BooleanClause(new TermQuery(new Term(strFieldName, strTerm)), BooleanClause.Occur.SHOULD));
int iHits4Term = searcher.totalHitCount(booleanQuery4Term);
tmAllFieldTerms.put(strTerm, iHits4Term);
});
// die Liste braucht einen Vector - da können wir auch gleich die unnötigen aussortieren
Vector<String> vFieldTermLabels = new Vector<String>(iHardCodedListLength);
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment