---
title: "Solrを使って検索結果をグループ化する方法"
slug: "using-solr-to-group-search-results"
abstract: "共通フィールドの値に基づいて検索結果をグループ化できます"
---
# Solrを使って検索結果をグループ化する方法

> !注このトピックはSitecore 9.0以降にも適用されます。

Solrには結果グループ化機能があります。この機能を使って、共通のフィールド値に基づいて文書をグループに並べ替えます。Solrは各グループの上位文書を返します。

例えば、「DVD」で検索すると、「TV and Video」「Movies」「Computers」の3つのカテゴリを返し、各カテゴリごとに3つの結果が表示されます。この場合、「DVD」というクエリ語が3つのカテゴリすべてに表示されます。Solrはエンドユーザーにとってより有用な結果をまとめて作成します。

この機能を使うためにSolrで何も設定する必要はありません。

詳細はこちらをご覧ください:

[https://cwiki.apache.org/confluence/display/solr/Result+Grouping](https://cwiki.apache.org/confluence/display/solr/Result+Grouping)

## Sitecoreでの利用

SitecoreにはSolrの結果グループ化機能にアクセスするためのAPIがあります。このAPIは既存のContentSearch APIの拡張として設計されています。

プロジェクトでAPIを使用するには以下の手順に従ってください:

1.  以下のDLLファイルをプロジェクトに参照してください(Sitecoreウェブサイトの bin フォルダから入手可能です):
    -   SolrNet.dll
    -   Sitecore.ContentSearch.dll
    -   Sitecore.ContentSearch.SolrProvider.dll
    -   Sitecore.ContentSearch.SolrNetExtension.dll
2.  以下の名前空間をインポートします:
    -   Sitecore.ContentSearch.SolrNetExtension (SuggesterComponentの実装を含むSolrNetの拡張)

結果グルーピングAPIをISearchIndexの一部として利用できるようになりました:

1.  クエリは文字列や ISolrQueryの実装として作成してください。
2.  メソッド IProviderSearchContext.Query() 呼び出し、返された結果の型を検査します SolrQueryResults<T>.

返された結果にはGrouping性質が含まれており、Dictionary<string, GroupedResults<T>>であり、Keyはグループフィールド名、ValueはGroupedResultsのオブジェクトであり、グループ化された文書のリストとともにグループ化される一意の一致文書の数を表します(ICollection<Group<T>>)。

各Group<T> オブジェクトにはSolr文書、グループの値、グループ内の文書数が含まれています。

例えば:

![4A471C394BA548F08D325C3DFB75038F.png](https://doc.sitecore.com/api/markdown-image/xp/ja/developers/103/platform-administration-and-architecture/images/4A471C394BA548F08D325C3DFB75038F.png)

## APIドキュメント

クエリ

ソルに対してクエリを実行します。

### 構文論

public static SolrQueryResults<T> Query<T>(
 this IProviderSearchContext context,
 string q,
 QueryOptions options
)

### パラメータ

-   背景
    
    タイプ: Sitecore.ContentSearch.IProviderSearchContext
    
    検索プロバイダーの文脈
    
-   q
    
    Solrクエリ文字列
    
-   オプション
    
    タイプ: SolrNet.Commands.Parameters.QueryOptions
    
    クエリオプション
    

### 型パラメータ

-   T
    
    結果項目の種類
    

### 発言

このメソッドは、定義されたオプション集合(2つ目のパラメータ)でSolrに対してクエリ(最初の引数)を実行し、結果を値の辞書として取得します。

## 例

The following example illustrates the basic usage of result grouping.
<%@ Page Language="C#" AutoEventWireup="true" %>
<%@ Import namespace="Sitecore.ContentSearch.SolrProvider.SolrNetIntegration" %>
<%@ Import namespace="Sitecore.ContentSearch" %>
<%@ Import namespace="Sitecore.Configuration" %>
<%@ Import namespace="Sitecore.Data" %>
<%@ Import namespace="Sitecore.Data.Items" %>
<%@ Import namespace="SolrNet.Commands.Parameters" %>
<%@ Import namespace="Sitecore.ContentSearch.SearchTypes" %>
<%@ Import Namespace="Sitecore.SecurityModel" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
 <title>Solr | Grouping results demo</title>
 <script runat="server">
 private void PerformSearch(object sender, EventArgs e)
 {
 using (var ctx = ContentSearchManager.GetIndex("sitecore\_master\_index").CreateSearchContext())
 {
 var input = string.IsNullOrEmpty(searchTextBox.Value) ? "\*" : searchTextBox.Value.Replace(" ", "+");
 string q = String.Format("(name\_t:{0} OR color\_t:{0}) AND \_parent:110d559fdea542ea9c1c8a5df7e70ef9", input);
 var options = new QueryOptions
 {
 Grouping = new GroupingParameters
 {
 Fields = new  { "type\_t" },
 Limit = 10
 }
 };
 var result = ctx.Query<SitecoreUISearchResultItem>(q, options);
 StringBuilder htmlBuilder = new StringBuilder();
 foreach (var group in result.Grouping)
 {
 foreach (var grp in group.Value.Groups)
 {
 htmlBuilder.Append("<div class=\\"group\\">");
 htmlBuilder.AppendFormat("<div class=\\"group-header\\">{0}</div>", grp.GroupValue);
 htmlBuilder.Append("<div class=\\"group-item\\">");
 foreach (var item in grp.Documents)
 {
 htmlBuilder.AppendFormat("<span>{0} ({1})</span>", item"Name", item"Color");
 }
 htmlBuilder.Append("</div>");
 htmlBuilder.Append("</div>");
 }
 }
 searchResults.InnerHtml = htmlBuilder.ToString();
 }
 }
 private void Page\_Load(object sender, EventArgs e)
 {
 if (!IsPostBack && Request"create" == "true")
 {
 using (new SecurityDisabler())
 {
 GenerateTheItems();
 }
 }
 }
 #region Create the demo items
 private void GenerateTheItems()
 {
 var master = Factory.GetDatabase("master");
 if (master.GetItem("/sitecore/templates/sample/Vehicle") != null)
 {
 return;
 }
 var sampleTemplates = master.GetItem("/sitecore/templates/sample");
 var vehicleTemplate = CreateTemplate(master, sampleTemplates);
 var home = master.GetItem("/sitecore/content/Home");
 CreateItem(home, vehicleTemplate, "Toyota", "Corolla", "Red", "Sedan");
 CreateItem(home, vehicleTemplate, "Toyota", "Avanza", "Blue", "MPV");
 CreateItem(home, vehicleTemplate, "Toyota", "Camry", "Blue", "Sedan");
 CreateItem(home, vehicleTemplate, "Honda", "Civic", "White", "Sedan");
 CreateItem(home, vehicleTemplate, "Perodua", "Myvi", "White", "Hatchback");
 CreateItem(home, vehicleTemplate, "Perodua", "Myvi", "Red", "Hatchback");
 Response.Write("Done!");
 }
 private void CreateItem(Item home, TemplateItem vehicleTemplate, string model, string name, string color, string type)
 {
 var car = home.Add(model, vehicleTemplate);
 car.Editing.BeginEdit();
 car"Color" = color;
 car"Type" = type;
 car"Name" = name;
 car.Editing.EndEdit();
 }
 private TemplateItem CreateTemplate(Database master, Item parent)
 {
 var vehicleTemplate = master.Templates.CreateTemplate("Vehicle", parent);
 var dataSection = vehicleTemplate.AddSection("Data");
 dataSection.AddField("Type");
 dataSection.AddField("Color");
 dataSection.AddField("Name");
 return vehicleTemplate;
 }
 #endregion
 </script>
 <style>
 .group {
 font-family: sans-serif;
 border: #aecce6 solid 1px;
 margin: 10px;
 }
 .group-header {
 font-size: larger;
 font-weight: bold;
 background-color: aliceblue;
 padding: 10px;
 }
 .group-item {
 padding: 10px;
 display: grid;
 }
 </style>
</head>
<body>
 <form id="form1" runat="server">
 <div align="center">
 <input type="text" id="searchTextBox" style="width: 80%;" placeholder="Enter car model or color" runat="server" autocomplete="off" />
 <asp:Button Text="Search" OnClick="PerformSearch" runat="server" />
 </div>
 <div id="searchResults" runat="server"></div>
 </form>
</body>
</html>