1

我使用 SOLR 作为我的搜索查询数据库。我目前的要求是将此文档发布到 SOLR 数据库上。

namespace SOLRApp
{
    public class Table1Document
    {
        public Table1Document()
        {
            MobileNos = new List<int>();
            EducationalDetails = new List<EducationalDetails>();
        }

        [SolrUniqueKey("ID")]
        public string ID { get; set; }

        [SolrField("FirstName")]
        public string FirstName { get; set; }

        [SolrField("LastName")]
        public string LastName{ get; set; }

        [SolrField("MobileNos")]
        public List<int> MobileNos { get; set; }

        [SolrField("EducationalDetails")]
        public List<EducationalDetails> EducationalDetails { get; set; }

    }

    public class EducationalDetails
    {
        public EducationalDetails()
        {
            Details = new List<Details>();
        }

        public List<Details> Details { get; set; }
    }

    public class Details
    {
        [SolrField("IntitutionName")]
        public string IntitutionName { get; set; }

        [SolrField("EnrollDate")]
        public DateTime EnrollDate { get; set; }

        [SolrField("PassoutDate")]
        public DateTime PassoutDate { get; set; }

        [SolrField("InstituteRating")]
        public int InstituteRating { get; set; }
    }
}

为此,我添加了这个带有字段的模式文件,如下所示。

        <field name="ID" type="int" indexed="true" stored="true"/>
        <field name="FirstName" type="string" indexed="true" stored="true"/>
        <field name="LastName" type="string" indexed="true" stored="true" />
        <field name="MobileNos" type="string" indexed="true" stored="true" multiValued="true" />
        <field name="EducationalDetails" type="EducationalDetails" indexed="true" stored="true" multiValued="true">
            <field name="Details" type="string" indexed="true" stored="true" multiValued="true">
                <field name="IntitutionName" type="string" indexed="true" stored="true"/>
                <field name="EnrollDate" type="date" indexed="true" stored="true"/>
                <field name="PassoutDate" type="date" indexed="true" stored="true"/>
                <field name="InstituteRating" type="string" indexed="true" stored="true"/>
            </field>
        </field>

我想知道如何在 SOLR 中添加用户定义的数据类型。就像在我的示例中一样,“EducationalDetails”是用户定义的数据类型(类)。谁能告诉我如何在 SOLR 中添加它。

先感谢您。

4

1 回答 1

1

您可以使用标签创建自己的类型<fieldType />,例如:

<fieldType name="cstring" class="solr.TextField" sortMissingLast="true" omitNorms="true">
    <analyzer>
        <tokenizer class="solr.KeywordTokenizerFactory" />
        <filter class="solr.TrimFilterFactory" updateOffsets="true" />
        <filter class="solr.PatternReplaceFilterFactory" pattern="\s+$" replacement="" />
        <filter class="solr.ASCIIFoldingFilterFactory" />
    </analyzer>
</fieldType>

但是,正如您所注意到的,这与您想要的完全不同。Solr 无法获得您想要的东西(子字段,...)。Solr 是基于文档的存储,而不是“对象”存储或您希望如何查看它。

我能想出的最佳解决方案是创建多种“类型”的文档。您的计划应如下所示:

<field name="ID" type="int" indexed="true" stored="true"/>
<field name="FirstName" type="string" indexed="true" stored="true"/>
<field name="LastName" type="string" indexed="true" stored="true" />
<field name="MobileNos" type="string" indexed="true" stored="true" multiValued="true" />

<!-- Education details -->
<field name="IntitutionName" type="string" indexed="true" stored="true"/>
<field name="EnrollDate" type="date" indexed="true" stored="true"/>
<field name="PassoutDate" type="date" indexed="true" stored="true"/>
<field name="InstituteRating" type="string" indexed="true" stored="true"/>
<field name="DocumentID" type="int" indexed="true" stored="true"/>

<field name="Type" type="string" indexed="true" stored="true"/>

如果您将 Table1Document 添加到 Solr,您只需提供 ID、FirstName、LastName 和 MobileNos 字段(此外,您可以使用Type字段并添加“Table1Document”

如果添加 EducationDetails 对象,则只需提供机构名称、EnrollDate、PassoutDate 和 InstituteRating 字段。在DocumentID字段中,您可以引用它们应该属于的 Table1Document 的 ID。在类型字段中,您可以添加“EducationDetails”。

如果您现在要检索 Table1Document,请使用如下查询:

type:Table1Document AND id:1

要获取属于它的 EducationDetails,您可以使用如下查询:

type:EducationDetails AND DocumentID:1

之后你仍然可以用你喜欢的结构构造一个对象。

于 2013-06-07T09:43:10.207 回答