Apache Lucene: Mehrere Terme per WildCard suchen
Unbedachte Suchanfragen bei einer Live-Search per AJAX können schnell den Server lahmlegen.
Ich implementiere gerade zu Testzwecken eine Live-Search, d.h. während Sie die Suchbegriffe eingeben, werden per AJAX die Suchergebnisse dargestellt. Da Lucene unglauchblich schnell ist, stellt das auch bei großen Datenbanken kein Problem dar, außer man sucht alle Terme mit WildCard.
Wenn Sie z.B. nach “web* e*” suchen werden alle Resultate angezeigt, die mit web und e beginnen. Man kann sich vorstellen, dass das sehr schnell zu sehr vielen Suchergebnissen führen kann.
Um das ganze zu optimieren, habe ich zunächst einmal den Default-Operator, also die Operation mit der mehrere Terme verknüft werden sollen auf AND gestellt. Dadurch minimieren sich auch bei relativ kurzen Queries die Ergebnisse. Ihr gewählter QueryParser bietet dazu die Funktion setDefaultOperator. Das sieht dann z.B. so aus:
qp.setDefaultOperator(QueryParser.AND_OPERATOR);
Um nun die einzelnen Suchbegriffe per WildCard zu suchen, nutze ich zunächst einen StringTokenizer um die Phrasen zu zerlegen und füge im Anschluss den Stern (*) hinzu. Eine Fuzzy-Suche mit Tilde (~) wäre auf diese Weise auch möglich.
StringBuffer qb = new StringBuffer(); StringTokenizer st = new StringTokenizer(q); while (st.hasMoreTokens()) { qb.append(" "+st.nextToken()+"*"); } Hits h = search(qb.toString().trim());
Die Suchergebnisse sind dabei wirklich sehr gut und entsprechen meinen Erwartungen. Auf diese Art und Weise würde ich gern immer suchen:
Ich fürchte, dass selbst für Google soviele Suchanfragen zu viel sind. Google Suggestion kann momenten auch soetwas nicht wirklich performant handhaben.
Keep Searching!
Mitdiskutieren