我使用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中添加它。
提前谢谢。
答案 0 :(得分: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对象,则只提供InstitutionName,EnrollDate,PassoutDate和InstituteRating字段。在 DocumentID 字段中,您可以引用它们应属于的Table1Document的ID。在类型字段中,您可以添加“EducationDetails”。
如果您现在想要检索Table1Document,请使用如下查询:
type:Table1Document AND id:1
要获取属于它的EducationDetails,您可以使用如下查询:
type:EducationDetails AND DocumentID:1
之后你仍然可以用你喜欢的结构构建一个对象。