2016-02-24 3 views
0

J'essaie d'implémenter mon propre service de recherche personnalisé. Si je comprends bienService de recherche personnalisé Orchard Lucene avec regroupement de requêtes et requête de plage numérique

// If I wanted to query "+name:camera +price:[100 TO 150] +location:thailand" 
searchBuilder.WithField("name", "camera").ExactMatch().Mandatory(); 
searchBuilder.WithinRange("price", 100, 150, true, true).Mandatory(); 
searchBuilder.WithField("location", "thailand").ExactMatch().Mandatory(); 

Pas de problème ici. Mais comment aborder une requête avec groupement (clauses avec parenthèses)?

// How do I query "+name:camera +(price:[100 TO 150] cost:[100 TO 150]) +(bundle-price:[100 TO 150] total-price:[100 TO 150])"? 
// Since the ISearchBuilder interface doesn't support grouping, the only other way 
// I could think of is to use the freestyle ISearchBuilder.Parse() to construct the query. 
// However this doesn't return any hits: 
searchBuilder.WithField("name", "camera").ExactMatch().Mandatory(); 
searchBuilder.Parse("price", "[100 TO 150] cost:[100 TO 150]", false).Mandatory(); 
searchBuilder.Parse("bundle-price", "[100 TO 150] total-price:[100 TO 150]", false).Mandatory(); 

Il est tout simplement pas assez d'informations pour déterminer le ISearchBuilder.Parse() de type de données de la gamme (que ce soit int, float ou double). On dirait que Luc est d'avoir ce problème trop qui peut être contournée en utilisant XML Query Parser que je ne pense pas Lucene.Net a:

Lucene numeric range search with LUKE


Je pensais que si le ISearchBuilder a une méthode pour nous permettent d'insérer notre propre requête

// /src/Orchard/Indexing/ISearchBuider.cs 
public interface ISearchBuilder { 
    ISearchBuilder WithQuery(Query query); 
} 

// /src/Orchard.Web/Modules/Lucene/Services/LuceneSearchBuilder.cs 
public class LuceneSearchBuilder : ISearchBuilder { 
    public ISearchBuilder WithQuery(Query query) { 
     CreatePendingClause(); 
     _query = query; 
     return this; 
    } 
} 

public class CustomSearchService { 
    public void Search() { 
     // construct our own custom queries 
     var booleanQuery1 = new BooleanQuery(); 
     booleanQuery1.Add(NumericRangeQuery.NewDoubleRange("price", 100, 150, true, true), Occur.SHOULD); 
     booleanQuery1.Add(NumericRangeQuery.NewDoubleRange("cost", 100, 150, true, true), Occur.SHOULD); 

     var booleanQuery2 = new BooleanQuery(); 
     booleanQuery2.Add(NumericRangeQuery.NewDoubleRange("bundle-price", 100, 150, true, true), Occur.SHOULD); 
     booleanQuery2.Add(NumericRangeQuery.NewDoubleRange("total-price", 100, 150, true, true), Occur.SHOULD); 

     searchBuilder.WithField("name", "camera").ExactMatch().Mandatory(); 
     // insert our custom queries into the SearchBuilder using the newly added interface method (ISearchBuilder.WithQuery()) above 
     searchBuilder.WithQuery(booleanQuery1).Mandatory(); 
     searchBuilder.WithQuery(booleanQuery2).Mandatory(); 
    } 
} 

puis nous pouvons construire des requêtes plus complexes et flexibles.

Mise à jour

Quelqu'un a soulevé cette question avant à https://github.com/OrchardCMS/Orchard/issues/5764

Répondre

-1

Vous devriez probablement utiliser l'API de recherche avec facettes. Voici une présentation exacte: https://www.youtube.com/watch?v=7v5qSR4g7E0 et quelques notes ici: http://weblogs.asp.net/bleroy/orchard-harvest-2015-search-api

+0

Je l'ai déjà vu plus tôt, mais je ne vois pas comment cela se rapporte à mon problème. Pourriez-vous élaborer davantage? D'après son apparence, facette est comme appliquer une clause simple comme un filtre à la requête existante, pas un groupe complexe de clauses. De plus, la recherche à facettes met l'accent sur le résumé du nombre de résultats. Je suis plus intéressé par les hits réels (documents retournés par les hits) plutôt que par le nombre de hits. –