RavenDB - 在“动态查询”中使用“分析器”

时间:2014-03-29 21:59:53

标签: ravendb

这与我询问的关于如何不使用动态查询的另一篇文章相反,但是为了准备我可能需要的想法,我试图了解更多。

我的情况是有时我想要分析一个字段,有时我不这样做。我现在通过两个单独的索引来解决这个问题。

/// <summary>
/// Query for an entity by its identity or name, using full indexing to search for specific parts of either.
/// </summary>
public class [ENTITY]__ByName : AbstractIndexCreationTask<[ENTITY]> {
    public [ENTITY]__ByName() {
        Map = results => from result in results
                         select new {
                             Id = result.Id,
                             Name = result.Name
                         };

        Index(n => n.Name, FieldIndexing.Analyzed);
    }
}

/// <summary>
/// Query for an entity by its full name, or full identity without any analyzed results, forcing
/// all matches to be absolutely identical.
/// </summary>
public class [ENTITY]__ByFullName : AbstractIndexCreationTask<[ENTITY]> {
    public [ENTITY]__ByFullName() {
        Map = results => from result in results
                         select new {
                             Id = result.Id,
                             Name = result.Name
                         };
    }
}

然而,我被告知我应该使用&#34;动态索引&#34; (这对我来说无法达到索引的目的,但这个评论来自一位我非常尊重的高级开发人员,所以我很有意思)

所以,我需要弄清楚如何将我在分析器中的偏好传递给动态查询。现在我的查询看起来像......

RavenQueryStatistics statistics;

var query = RavenSession
    .Query<[ENTITY], [INDEX]>()
    .Customize(c => c.WaitForNonStaleResultsAsOfNow())
    .Statistics(out statistics)
    .Search(r => r.Name, [name variable])
    .Skip((request.page - 1) * request.PageSize)
    .Take(request.PageSize)
    .ToList();

var totalResults = statistics.TotalResults;

好吧,既然我被告知有这么多索引并不是我应该做的事情,我需要去动态查询吗?所以它更像是......?

RavenQueryStatistics statistics;

var query = RavenSession
    .Query<[ENTITY]>()
    .Customize(c => c.WaitForNonStaleResultsAsOfNow())
    .Statistics(out statistics)
    .Search(r => r.Name, [name variable])
    .Skip((request.page - 1) * request.PageSize)
    .Take(request.PageSize)
    .ToList();

var totalResults = statistics.TotalResults;

但问题是有时我想要一个Analyzer - 有时我不想。例如......

在6000个结果的网格上,如果用户进行&#34;搜索&#34;对于One,我希望它能够找到名称中One 任何地方的所有内容。分析仪允许这样做。

验证程序上,旨在确保用户不会添加与另一个实体完全相同的新实体,我不希望这样的灵活性。如果用户输入Item Number作为名称,并且Item Number 2存在,我不希望它匹配,因为一个或两个单词匹配。如果他们输入完全相同的单词,我希望它匹配。

那么,有没有办法将其合并到dynamic个查询中?或者我很聪明地继续使用不同的查询?

0 个答案:

没有答案