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