0

SolrNetを使用して、一連のテーブルのデータにインデックスを付けたり検索したりしています。

カテゴリとアイテムの2つのテーブルがあります。

両方のテーブルに同じフィールドがあるため、派生した基本マッピングクラス形式があります。

[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);

不思議なことに、Itemテーブルからレコードを取得しています。

SolrNet(検索エンジン)に、指定したタイプ内を検索するように指示するにはどうすればよいですか。

または、そもそも正しくインデックスを作成していますか?

助けてください。

ありがとう、

4

3 に答える 3

1

データをインデックスに追加し、クライアントで既知のタイプに基づいてクエリを実行しているときに、データをすべてSolrの同じスキーマに格納し、Solrのカテゴリレコードからアイテムを区別する方法を指定していません。 。次のような単純な文字列にすることができる型フィールドを含めるようにスキーマを変更することをお勧めします。

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

次に、タイプフィールドをSolrSearchEntity基本クラスに追加し、CategoryクラスとItemクラスで適切に設定する必要があります。次のようなもの:

[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値がデータベースで重複しないように注意してください。重複すると、エンティティのインスタンスが1つだけ保存されます(カテゴリまたはアイテムのいずれか最後にインデックスが付けられた方)。

最後に、あなたの現在のインデックス作成戦略は健全であり、DIHの使用を推奨しないと思います。IMO、SolrNetクライアントライブラリを使用すると、より多くの制御と柔軟性が得られます。私は過去にデータインポートハンドラーに問題があり、SolrNetを使用すると管理と保守がはるかに簡単になることがわかりました。

于 2013-01-02T12:44:36.363 に答える
0

DBから複数のテーブルにインデックスを付ける場合は、クライアントライブラリではなく、柔軟性のあるSolrDIHを使用します。

于 2013-01-02T08:57:17.023 に答える
0

クックが言及した提案に加えて、

SolrSearchEntityにGUIDフィールドを追加します

 [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>

これで、インデックスが重複したり矛盾したりすることはなくなり、検索は指定されたタイプに絞り込まれます。

于 2013-01-04T10:46:21.273 に答える