2017-06-09 2 views
0

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

Antwort

0

Sie könnten versuchen, ein Schlüsselwort Abfrage anstelle einer Phrasenabfrage: queryBuilder.keyword().onField("nameEn").boostedTo(5).matching(keyWord.toLowerCase()).createQuery();

Wenn, wie der Name Ihres Analysators sugg Wenn Sie eine automatische Vervollständigung durchführen, ist die Phrasenabfrage möglicherweise nicht relevant. In jedem Fall wäre dies ein erster Schritt, um Dinge zum Laufen zu bringen.

Als Nebenbemerkung möchten Sie möglicherweise verhindern, dass die N-Gramme bei der Analyse der Abfrage generiert werden (insbesondere, wenn Sie Phrasenabfragen benötigen). Weitere Informationen hierzu finden Sie in der „EDIT“ -Teil in dieser Antwort: Hibernate search to find partial matches of a phrase

+0

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

+0

@AymenKanzari Richtig, es gab einen Tippfehler im Beispiel: EdgeNGramTokenFilter.class sollte EdgeNGramTokenFilterFactory.class sein. Ich habe das Beispiel korrigiert. –

+0

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. –