0

RavenDB 2 クライアントを使用しています。

ユーザーがカテゴリで検索して製品を返すことができるようにしたいと考えています。のカテゴリ名のHigh Heels場合、ユーザーがheelsカテゴリの製品を検索して取得できるようにしますHigh Heels

CategoryName次のように、インデックスにフィールドを設定しました。

Analyzers.Add(x => x.CategoryName, "SimpleAnalyzer");

のファセットを表示したいときに問題が発生しCategoryNameます。ヒット 1を返す代わりに、ヒット 1 とヒット 1 をhigh heels返します。highheels

なぜこれを行っているのかを理解しており、次を使用してみました:

Stores.Add(x => x.CategoryName, FieldStorage.Yes);

しかし、ファセットで使用すると成功しません。

だから私の質問は、ファセットを使用するフィールドhigh heelsの代わりにhigh返すにはどうすればよいですか?heelsSimpleAnalyzer

私のコードは以下です:

マイインデックス

public class ProductIndex : AbstractIndexCreationTask<Product,ProductIndex.ProductIndexItem>
{
    public class ProductIndexItem
    {
        public string Name { get; set; }

        public string CategoryName { get; set; }
    }

    public ProductIndex()
    {
        Map = products => from product in products
                          from category in product.Categories
                          select new
                              {
                                  product.Name,
                                  CategoryName = category.Name
                              };

        Stores.Add(x => x.CategoryName, FieldStorage.Yes);
        Analyzers.Add(x => x.CategoryName, "SimpleAnalyzer");
    }
}

私のテスト

    [Test]
    public void MultiTermCategoryTest()
    {
        var product = new Product
            {
                Name = "MyProductName",
                Categories = new List<Category>
                    {
                        new Category
                            {
                                Name = "High Heels",
                            }
                    }
            };

        _session.Store(product);
        _session.SaveChanges();

        var query = _session.Advanced.LuceneQuery<Product>("ProductIndex")
                            .WaitForNonStaleResults()
                            .Search("CategoryName", "heels");

        var products = query.ToList();
        var facets = query.SelectFields<Facet>("CategoryName").ToFacets("facets/ProdctFacets");

        // Check that product has been returned
        Assert.That(products.Count, Is.EqualTo(1), "Product count is incorrect.");

        // Check that facet has been returned
        Assert.That(facets.Results.Count, Is.EqualTo(1), "Facet Results count is incorrect");
        var facetResult = facets.Results.FirstOrDefault();

        // Check that factes are what I want
        Assert.That(facetResult.Key, Is.EqualTo("CategoryName"));

         // ** Fails here returning a count of 2** 
        Assert.That(facetResult.Value.Values.Count, Is.EqualTo(1), "Facet.Value.Values count is incorrect");
    }
4

1 に答える 1

0

Ayende Rahien のアドバイスに感謝します。

私が試みていた方法では上記のことはできないことがわかりました。

インデックスには 2 つのフィールドが必要でした。1 つはインデックス作成用で、もう 1 つは元の値を格納するためです。そこで、インデックスを次のように変更しました。

public class ProductIndex : AbstractIndexCreationTask<Product,ProductIndex.ProductIndexItem>
{
    public class ProductIndexItem
    {
        public string Name { get; set; }

        public string CategoryName { get; set; }

        public string CategoryNameAnalyzed { get; set; }
    }

    public ProductIndex()
    {
        Map = products => from product in products
                          from category in product.Categories
                          select new
                              {
                                  product.Name,
                                  CategoryName = category.Name,
                                  CategoryNameAnalyzed = category.Name,
                              };

        Stores.Add(x => x.CategoryName, FieldStorage.Yes);
        Analyzers.Add(x => x.CategoryNameAnalyzed, "SimpleAnalyzer");
    }
}

そして私のクエリは次のように変わりました:

var query = _session.Advanced.LuceneQuery<Product>("ProductIndex")
                            .WaitForNonStaleResults()
                            .Search("CategoryNameAnalyzed", "heels");
var products = query.ToList();
var facets = query.ToFacets("facets/ProdctFacets");

これが他の誰かに役立つことを願っています。

于 2013-03-22T19:01:08.400 に答える