2013-01-02 45 views
0

我正在使用SolrNet在一組表上搜索數據。如何在SolrNet的多個表上執行索引/搜索

我有兩個表分類和項目。

這兩個表具有相同的字段,因此我有一個基礎映射類形式,我導出。索引分類數據

[Serializable] 
    [XmlRoot(ElementName = "SolrSearchEntity", Namespace = "")] 
    [DataContract(Name = "SolrSearchEntity", Namespace = "")] 
    public class SolrSearchEntity 
    { 
     [XmlElement(ElementName = "Id")] 
     [DataMember(Name = "Id", IsRequired = true)] 
     [SolrUniqueKey("id")] 
     public string Id { get; set; } 

     [XmlElement(ElementName = "Name")] 
     [DataMember(Name = "Name", IsRequired = true)] 
     [SolrField("name")] 
     public string Name { get; set; } 
    } 

public class Category : SolrSearchEntity 
    {   
    } 

    public class Item : SolrSearchEntity 
    { 
    } 

代碼塊

using (SolrBaseRepository.Instance<Category> repository = new SolrBaseRepository.Instance<Category>()) 
      { 
       var output = ItemStoreDataManager.GetAllCategoryNames(dataAdapter); 
       repository.Start(); 
       var solr = ServiceLocator.Current.GetInstance<ISolrOperations<Category>>(); 
       solr.AddRange(output); 
       solr.Commit(); 
      } 

索引項數據代碼塊

using (SolrBaseRepository.Instance<Item> repository = new SolrBaseRepository.Instance<Item>()) 
       { 
        var output = ItemStoreDataManager.GetAllItemNames(dataAdapter); 
        repository.Start(); 
        var solr = ServiceLocator.Current.GetInstance<ISolrOperations<Item>>(); 
        solr.AddRange(output); 
        solr.Commit(); 
       } 

我Schema.xml的具有

<fields> 
    <!-- declare fields of entity class --> 
    <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
    <field name="name" type="text_general" indexed="true" stored="true" omitNorms="true"/> 

    <field name="text" type="text_general" indexed="true" stored="false" multiValued="true"/> 
    <field name="_version_" type="long" indexed="true" stored="true"/> 

    </fields> 

查詢的類別數據

var entities = ItemStoreManager<Category>.Search(keyword); which will internally execute this. 

    new SolrBaseRepository.Instance<T>().Start(); 
    var solr = ServiceLocator.Current.GetInstance<ISolrOperations<T>>(); 
    var results = solr.Query(keyword); 

奇怪的是,我從項目表中獲取的記錄。

我該如何告訴SolrNet(搜索引擎)來查看我指定的類型。

或者我在第一個地方正確編制索引?

請幫忙。

感謝,

回答

0

除了由庫克提到的建議,

添加GUID場SolrSearchEntity

[XmlElement(ElementName = "UId")] 
[DataMember(Name = "UId", IsRequired = true)] 
[SolrUniqueKey("uid")] 
public Guid UId { get; set; } 

初始化自身UID與構造

public Item() 
{ 
    Type = "Item"; 
    UId = Guid.NewGuid(); 
} 

變化schema.xml中

<fieldType name="uuid" class="solr.UUIDField" indexed="true" /> 

<!-- unique field --> 
<field name="uid" type="uuid" indexed="true" stored="true" /> 

<uniqueKey>uid</uniqueKey> 

現在索引不會重疊或不一致,搜索將縮小到指定的類型。

0

對於從數據庫索引多個表,我寧願去Solr DIH其靈活性,而不是任何客戶端庫。

1

當您將數據添加到索引並正在基於客戶端上的已知類型進行查詢時將數據分開,您將它們全部存儲在Solr中的相同模式中,並且沒有指定任何方式來區分項目Solr中的類別記錄。我建議你修改你的架構,包括一個型字段,它可以只是一個簡單的字符串,如下列:

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

然後,你需要將類型字段添加到您的SolrSearchEntity基類,並將其設置適當地在類別和項目類別中。像下面這樣:

[Serializable] 
[XmlRoot(ElementName = "SolrSearchEntity", Namespace = "")] 
[DataContract(Name = "SolrSearchEntity", Namespace = "")] 
public class SolrSearchEntity 
{ 
    [XmlElement(ElementName = "Id")] 
    [DataMember(Name = "Id", IsRequired = true)] 
    [SolrUniqueKey("id")] 
    public string Id { get; set; } 

    [XmlElement(ElementName = "Name")] 
    [DataMember(Name = "Name", IsRequired = true)] 
    [SolrField("name")] 
    public string Name { get; set; } 

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

public class Category : SolrSearchEntity 
{   
    public Category() 
    { 
     Type = "Category"; 
    } 
} 

public class Item : SolrSearchEntity 
{ 
    public Item() 
    { 
     Type = "Item"; 
    } 
} 

然後當你,如果你想通過一個特定的類型以限制查詢執行搜索,你可以這樣添加過濾器查詢僅搜索項目:

var entities = ItemStoreManager<Category>.Search(keyword); 
new SolrBaseRepository.Instance<T>().Start(); 
var solr = ServiceLocator.Current.GetInstance<ISolrOperations<T>>(); 
var options = new QueryOptions{ 
    FilterQueries = new ISolrQuery[] { new SolrQueryByField("type","Item")}}; 
var results = solr.Query(keyword, options); 

此外,請注意您的ID值在數據庫中不重疊,因爲這會導致您僅存儲實體的一個實例(類別或項目,以最後索引爲準)。

最後,我覺得你現在的索引策略是合理的,不會推薦使用DIH。國際海事組織,您將擁有使用SolrNet客戶端庫的更多控制和靈活性。過去我遇到過數據導入處理程序的問題,並發現SolrNet的使用更容易管理和維護。

+0

謝謝廚師。我採取了你所建議的方法。但是,表格的id值與正在運行的數字相似(重疊)。因此,我收到不正確的數據,查詢類別退貨項目數據。如何處理這個? – Prasad

+0

謝謝廚師。我採取了你所建議的方法。但是,表格的id值與正在運行的數字相似(重疊)。因此,我收到不正確的數據,查詢類別退貨項目數據。如何處理這個? – Prasad