So suchen Sie Felder mit Platzhalter und Leerzeichen in Hibernate Search
Habe ich ein Suchfeld, führt eine Suche auf den Titel des Felds basierend auf der gegebenen Eingabe, so dass der Benutzer hat empfohlen, alle verfügbaren Titel, beginnend mit dem text eingefügt.Es basiert auf Lucene und Hibernate Suchen. Es funktioniert gut, bis Leerzeichen eingegeben wird. Dann wird das Ergebnis verschwinden. Zum Beispiel, ich möchte "Lernen H" gebt mir, "Lernen Hibernate" als Ergebnis. Dies bedeutet jedoch nicht passieren. könnten Sie bitte beraten Sie mich was soll ich hier anstelle.
Abfrage-Generator:
QueryBuilder qBuilder = fullTextSession.getSearchFactory()
.buildQueryBuilder().forEntity(LearningGoal.class).get();
Query query = qBuilder.keyword().wildcard().onField("title")
.matching(searchString + "*").createQuery();
BooleanQuery bQuery = new BooleanQuery();
bQuery.add(query, BooleanClause.Occur.MUST);
for (LearningGoal exGoal : existingGoals) {
Term omittedTerm = new Term("id", String.valueOf(exGoal.getId()));
bQuery.add(new TermQuery(omittedTerm), BooleanClause.Occur.MUST_NOT);
}
@SuppressWarnings("unused")
org.hibernate.Query hibQuery = fullTextSession.createFullTextQuery(
query, LearningGoal.class);
Hibernate-Klasse:
@AnalyzerDef(name = "searchtokenanalyzer",tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
filters = {
@TokenFilterDef(factory = StandardFilterFactory.class),
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(factory = StopFilterFactory.class,params = {
@Parameter(name = "ignoreCase", value = "true") }) })
@Analyzer(definition = "searchtokenanalyzer")
public class LearningGoal extends Node {
- drucken Sie die Abfrage zur Ausgabe wird Ihnen definitiv helfen..
- Es ist nützlich, in der Tat, aber nicht mir helfen zu verstehen, warum ich keine Ergebnisse habe. Ich habe zum Beispiel Lernziel, dessen Titel "Lernen von Wahrscheinlichkeitstheorie". Die Ausgabe von zwei Abfragen bQuery:+title:lernen p* hibQuery:FullTextQueryImpl(Titel:learning p*) for input string "lernen p". Findet es Wert, wenn der input-string ist "lernen".
- Ich habe auch versucht zu ersetzen Leerzeichen mit ?, aber es gab nicht das Ergebnis.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand ich Abhilfe für dieses problem. Die Idee ist für die tokenisierung input-string und entfernen von stop-Wörter. Für das Letzte token habe ich eine Abfrage erstellt mit keyword-Platzhalter, und für das alle früheren Worte, die ich erstellt eine TermQuery. Hier ist der vollständige code
existingGoals
überhaupt notwendig?SQL verwendet verschiedene Platzhalter, als das terminal. In SQL
'%'
ersetzt null oder mehr vorkommen eines beliebigen Zeichens (im terminal, die Sie verwenden'*'
statt), und der Unterstrich'_'
ersetzt genau ein Zeichen (im terminal, die Sie verwenden'?'
statt). Hibernate nicht übersetzen das wildcard-Zeichen.So, in der zweiten Zeile haben Sie zu ersetzen
matching(searchString + "*")
mit