Ich möchte ein Schlüsselwort aus einer TextNGramFilterFactory nicht richtig funktioniert
Zum Beispiel, wenn nameEn = „Hallo allerseits TODAY“ extrahieren und ich tun, um die Suche nach dem Stichwort „Körper“ es zeigt mir das Ergebnis
verwendete ich die Anmerkung AnalyzerDef, aber ich habe ein Problem in meinem Code
ich das Problem erklären:
nameEn = "Hallo alle zusammen TODAY"
Zum Beispiel, wenn ich für „b“ zu suchen, es zeigt mir das Ergebnis
Aber wenn ich für „bo“ oder „bod“ oder „Körper“ zu suchen, es zeigt mir nichts
Jetzt, wenn ich ändere minGramSize bis 2
, wenn ich für „bo“ gesucht haben, zeigt es mir das Ergebnis
Und die andere Schlüsselworte „b“, „bod“, „Körper“ zeigt es mir nichts
ich tun nicht wissen, wo das Problem genau ist, denn nach dem Code unten, wenn ich ente red "bo"
Ausgang wird sein: "b", "bo"
@Indexed
@AnalyzerDef(name = "autocompleteNGramAnalyzer", tokenizer =
@TokenizerDef(factory = StandardTokenizerFactory.class), filters = {
@TokenFilterDef(factory = WordDelimiterFilterFactory.class),
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(factory = NGramFilterFactory.class, params = {
@Parameter(name = "minGramSize", value = "1"),
@Parameter(name = "maxGramSize", value = "50") }),
@TokenFilterDef(factory = PatternReplaceFilterFactory.class, params = {
@Parameter(name = "pattern", value = "([^a-zA-Z0-9\\.])"),
@Parameter(name = "replacement", value = " "), @Parameter(name = "replace", value = "all") }) })
@Analyzer(definition = "autocompleteNGramAnalyzer")
public class Product implements Serializable {
@Field(index = Index.YES, analyze = Analyze.YES, store = Store.NO)
private String nameEn;
Die Suchmethode:
public List<Product> searchProduct(String keyWord) {
FullTextSession fullTextSession = Search.getFullTextSession(getSession());
try {
fullTextSession.createIndexer().startAndWait();
} catch (InterruptedException e) {
e.printStackTrace();
}
QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Product.class).get();
org.apache.lucene.search.Query luceneQuery = queryBuilder.phrase().withSlop(2).onField("nameEn").boostedTo(5).sentence(keyWord.toLowerCase()).createQuery();
org.hibernate.Query fullTextQuery = fullTextSession.createFullTextQuery(luceneQuery, Product.class);
List<Product> result = fullTextQuery.list();
return result;
}
Jede Hilfe willkommen
habe ich das gleiche Beispiel, aber wenn ich EdgeNGramTokenFilter.class verwendet es zeigt mir diesen Fehler: Typenkonflikt: kann nicht aus der Klasse konvertieren zu Klasse extends TokenFilterFactory> –
@AymenKanzari Richtig, es gab einen Tippfehler im Beispiel: EdgeNGramTokenFilter.class sollte EdgeNGramTokenFilterFactory.class sein. Ich habe das Beispiel korrigiert. –
Hinweis: Es gibt keine EdgeNGramTokenFilterFactory.class, es gibt EdgeNGramFilterFactory.class. Ich habe das gleiche Problem. Beispiel: nameEn = [Juno Taylor, Tom Caner Junior, Alan Smith, John Cane, hat dieses Freizeithemd einen Mandarin Kragen ...]. 'Jun' zurück Juno Taylor und Tom Caner Junior, 'an' sollte zurückgeben Alan Smith, John Cane, Tom Caner Junior und dieses Freizeithemd hat einen Mandarin Kragen ..., aber es gibt nichts zurück , 'a' oder ' n 'sollte alle zurückgeben, aber es gibt nichts zurück. –