如何在多个(复杂结构)字段上进行RavenDB查询并返回匹配的值?

时间:2018-07-29 10:40:14

标签: c# indexing lucene ravendb

我有一个RavenDB 3.5集合“市政”,其文档结构如下:

{
  "Name": ...,
  ...,
  "Districts": [
    {
       "Name": ...,
       ...
    }
  ]
}

请注意,districts属性也可以为null。

现在,我正在使用排字头功能,您可以在其中搜索市政名称和地区名称。因此,我想(通配符全部)查询两个字段,并且还取回匹配的值。因此,我不需要整个文档,因为如果匹配项是在一个地区名称上,那么我就不容易返回该值。

我用.Search().Suggest()尝试了几种选择,但还不能完全解决问题。

1 个答案:

答案 0 :(得分:4)

要同时搜索市政名称和地区名称,您可以构建一个MultiMap index,该名称将两次映射同一集合中的名称,一次来自市政名称,一次将其散布到各地区名称中。

对索引的查询结果将是包含所有数据的文档。为了从索引中获得特定结果,您可以store the data要在索引中进行检索。这样,仅将返回预期的数据,而不会返回所有文档。

public class MunicipalitiesAndDistrictsNamesIndex : AbstractMultiMapIndexCreationTask<MunicipalitiesAndDistrictsNamesIndex.Result>
{
    public class Result
    {
        public string Name { get; set; }

        public string Value { get; set; }
    }

    public MunicipalitiesAndDistrictsNamesIndex()
    {
        AddMap<Municipality>(municipality => from m in municipalities
            select new
            {
                m.Name,
                m.Value,
            });

        AddMap<Municipality>(municipality => from m in municipalities
            from d in m.Districts
            select new
            {
                d.Name,
                d.Value,
            });

        // mark 'Name' field as analyzed which enables full text search operations
        Index(x => x.Name, FieldIndexing.Search);

        // storing fields so when projection
        // requests only those fields
        // then data will come from index only, not from storage
        Store(x => x.Name, FieldStorage.Yes);
        Store(x => x.Value, FieldStorage.Yes);
    }
}