1

RavenDB で製品をフィルタリングするには、長い切り替えを避けるために、製品フィルターの一般的なリストを使用します。

製品フィルター クラスは次のようになります。

public class ProductFilter
{
    public string FilterName { get; set; }
    public List<string> FilterValues { get; set; }

    public ProductFilter()
    {
        FilterValues = new List<string>();
    }
}

FilterName はインデックス プロパティ名と同じです

製品のクエリにこのインデックスを使用します。

public class CategoryProducts_Index : AbstractIndexCreationTask<Product, CategoryProducts_Index.ReduceResult>
{
    public class ReduceResult
    {
        public string Category { get; set; }
        public string Title { get; set; }
        public string Brand { get; set; }
        public decimal RegularPrice { get; set; }
    }

    public CategoryProducts_Index()
    {
        Map = products =>
              from p in products
              from c in p.Categories
              select new
              {
                  Category = c,
                  Title = p.Title,
                  Brand = p.Brand,
                  RegularPrice = p.RegularPrice
              };
    }
}

ProductFilter のリストをループして製品をフィルタリングする一般的なソリューションとして、次のような Lucene クエリのグループ化を実現したいと考えています。

Category: parent_category AND  (Category: sub_category_1 OR Category: sub_category_2 OR ...etc) AND (Brand: brand1 OR Brand:brand2 OR ...etc)

通常の Linq クエリでは、文字列名でインデックス プロパティを取得できませんでした。そのため、次のように LuceneQuery でそれを実行しようとしました。

public IDocumentQuery<Product> GetProductsBySelectedFilters(string category, List<ProductFilter> productFilters)
    {
        IDocumentQuery<Product> products;
        using (var session = DocumentStore.OpenSession())
        {
            products = session.Advanced.LuceneQuery<Product>("CategoryProducts/Index", isMapReduce: true)
                .WhereStartsWith("Category", category);

            foreach (var filter in productFilters)
            {
                products.UsingDefaultOperator(QueryOperator.And);
                foreach (var value in filter.FilterValues)
                {
                    products.WhereEquals(filter.FilterName, value);
                    products.UsingDefaultOperator(QueryOperator.Or);
                }
            }
        }
        return products;
    }

これの Lucene 出力クエリは次のようになります。

Category: parent_category Category: sub_category_1 Category: sub_category_2 Brand: brand1  Brand: brand2  ...etc

それは私が期待したものではありません

誰かがこれを処理する方法を知っていますか?

4

1 に答える 1

1

LuceneQuery の .OpenSubclause() と .CloseSubclause() を使用する

于 2013-05-15T21:05:54.783 に答える