基于ravendb/lucene的自然语言查询

基于ravendb/lucene的自然语言查询,lucene,ravendb,Lucene,Ravendb,以ravendb中的“zoo”文档列表为例,每个文档都有一个字段用于创建年份和一个字段用于描述。“描述”是一个字符串,除其他信息外,它将包括在该动物园可以看到的许多动物 (1) 我如何获取“黑猩猩和猩猩”或“大猩猩”而非狐猴的用户搜索值,并在动物园中搜索描述 (2) 除了1920年10年内建立的所有动物园外,我如何进行相同的搜索 (3) 如何进行以下近距离搜索:“黑猩猩、猩猩”~3和大象 就这个问题而言,不要担心动物名称的单数或复数形式。假设它们是复数形式 编辑:我希望下面的测试返回零结果,而不

以ravendb中的“zoo”文档列表为例,每个文档都有一个字段用于创建年份和一个字段用于描述。“描述”是一个字符串,除其他信息外,它将包括在该动物园可以看到的许多动物

(1) 我如何获取“黑猩猩和猩猩”或“大猩猩”而非狐猴的用户搜索值,并在动物园中搜索描述

(2) 除了1920年10年内建立的所有动物园外,我如何进行相同的搜索

(3) 如何进行以下近距离搜索:“黑猩猩、猩猩”~3和大象

就这个问题而言,不要担心动物名称的单数或复数形式。假设它们是复数形式

编辑:我希望下面的测试返回零结果,而不是返回两个结果:

    public void LuceneANDQuery()
    {
        var zoosToCreate = new List<Zoo>
                               {
                                   new Zoo()
                                       {
                                           Description = "We have alligators, orangutans and chimpanzees",
                                           AbbreviatedState = "DC"
                                       },
                                   new Zoo()
                                       {Description = "We have orangutans and elephants", AbbreviatedState = "CA"}
                               };
        using (var session = documentStore.OpenSession())
        {
            zoosToCreate.ForEach(session.Store);
            session.SaveChanges();
            new DescriptionIndex().Execute(documentStore);
            string searchPhrase = @"lizards && orangutans";
            var matchingZoos = session.Advanced.LuceneQuery<Zoo>("DescriptionIndex").Search("Description", searchPhrase).
                WaitForNonStaleResultsAsOfNow().ToList();
            int matchingZoosCount = matchingZoos.Count;
            Assert.AreEqual(matchingZoosCount, 0);
        }
    }

    public class DescriptionIndex : AbstractIndexCreationTask<Zoo>
    {
        public DescriptionIndex()
        {
            Map = zoos => from zoo in zoos
                          select new {zoo.Description};
            Analyzers.Add(z => z.Description, "Lucene.Net.Analysis.Standard.StandardAnalyzer");
            Indexes.Add(z => z.Description, FieldIndexing.Analyzed);
        }
    }
public void LuceneANDQuery()
{
var zoosToCreate=新建列表
{
新动物园
{
Description=“我们有鳄鱼、猩猩和黑猩猩”,
缩写state=“DC”
},
新动物园
{Description=“我们有猩猩和大象”,缩写为“CA”}
};
使用(var session=documentStore.OpenSession())
{
zoosToCreate.ForEach(session.Store);
session.SaveChanges();
新建DescriptionIndex().Execute(documentStore);
字符串搜索短语=@“蜥蜴和猩猩”;
var matchingZoos=session.Advanced.LuceneQuery(“DescriptionIndex”).Search(“Description”,searchPhrase)。
WaitForNonSalResultsAsOfNow().ToList();
int matchingzoosunt=matchingZoos.Count;
Assert.AreEqual(匹配ZoosCount,0);
}
}
公共类DescriptionIndex:AbstractIndexCreationTask
{
公共描述索引()
{
地图=动物园=>来自动物园中的动物园
选择新建{zoo.Description};
添加(z=>z.Description,“Lucene.Net.Analysis.Standard.StandardAnalyzer”);
添加(z=>z.Description,fieldindex.analysis);
}
}
Balazs, 你可以直接运行这个查询。RavenDB在封面下使用Lucene,并向外公开其查询。 这意味着您可以像这样运行查询。这将通过Session.Advanced.LuceneQuery在API中公开

需要注意的是,我们不支持默认字段,因此您需要指定您所指的字段,但仅此而已。

Balazs, 你可以直接运行这个查询。RavenDB在封面下使用Lucene,并向外公开其查询。 这意味着您可以像这样运行查询。这将通过Session.Advanced.LuceneQuery在API中公开


需要注意的一点是,我们不支持默认字段,因此您需要指定您所指的字段,但仅此而已。

除了我无法使其正常工作之外。请看我上面的测试。我希望它返回零个结果,而不是同时返回两个动物园。这是:字符串搜索短语=@“描述:蜥蜴和描述:猩猩”;var matchingZoos=session.Advanced.LuceneQuery(“DescriptionIndex”).Where(searchPhrase)。除了我不能让它正常工作之外。请看我上面的测试。我希望它返回零个结果,而不是同时返回两个动物园。这是:字符串搜索短语=@“描述:蜥蜴和描述:猩猩”;var matchingZoos=session.Advanced.LuceneQuery(“DescriptionIndex”).Where(searchPhrase)。