Solr - 为单个唯一ID存储多个Word文档

时间:2012-08-14 11:05:26

标签: c# solr solrnet

我们希望在Solr中索引并存储一组Word文档,并将它们显示为多值文本字段的元素,每个文档的内容在索引中的一个条目下显示为元素。换句话说,它看起来像这样

  • ID
    • abcdef [Word_1.docx的文字]
    • xyzabc [Word_2.docx的文字]
    • efghij [Word_3.docx的文字]

我们不希望索引的每个文档都有自己的唯一ID;一组文件将是特定身份证的子女。该ID可以有任意数量的文档。 怎么做?

更新:这是我的C#代码;如何使用(++count).ToString()

设置的唯一ID读取多个文档
using (FileStream fileStream = File.OpenRead(path))
{

    solr.Extract(
        new ExtractParameters(fileStream, (++_count).ToString())
            {
                ExtractFormat = ExtractFormat.Text,
                ExtractOnly = false,
                Fields = new List<ExtractField>()
                                                 {
                                                     new ExtractField("action", actionTo),
                                                     new ExtractField("actiondate", actionDate),
                                                     new ExtractField("abstract", abstract),
                                                     new ExtractField("docval", docval),
                                                     new ExtractField("documentgeo",documentgeo),
                                                     new ExtractField("filename", filename),
                                                     new ExtractField("isprimary", IsPrimary.ToString())
                                                 },
                                    AutoCommit = true 
            }
        );
}

1 个答案:

答案 0 :(得分:3)

在SOLR架构中定义两个字段 - idtexttext应该是多值的。然后在SolrInputDocument中汇总id和索引的文本数据。

<field name="id" type="int" multiValued="false" stored="true" indexed="true" />
<field name="text" type="text" multiValued="true" stored="true" indexed="true" />

我不知道c# API,但使用SolrJ很容易使用SolrInputDocument.addField("fieldname", "value")进行汇总。

更新示例

SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", 1)
for (String docText : documents){
    doc.addField("text", docText)
}

.NET更新示例

我会按以下方式定义我的课程:

public class Document{
[SolrUniqueKey("id")]
public integer Id { get; set; }

[SolrField("text")]
public ICollection<string> texts { get; set; }

然后我会填充它并提交类似这样的伪.NET代码:

Document doc = new Document();
for (String documentPath : paths) {
    using (FileStream fileStream = File.OpenRead(path)) {
        string id = fileStream.getId();
        if (doc.getId() == id){
            doc.getTexts.add(fileStream.getText())
        }
    }
}
var solr = ServiceLocator.Current.GetInstance<ISolrOperations<Document>>();
solr.Add(doc);
solr.Commit();