---
title: "Solrスペルチェッカーの使用"
slug: "using-the-solr-spell-checker"
abstract: "Solrのスペルチェック機能を使い、他の類似した用語に基づくインラインクエリの提案を作成しましょう。"
---
# Solrスペルチェッカーの使用

Solrにはスペルチェッカー機能があります。この機能を使って、他の類似した用語に基づいてユーザーにインラインクエリの提案を提供します。提案のソースは、Solr内のフィールド内の用語、外部テキストファイル、または他のインデックスのフィールドである場合があります。

ソースの設定方法は4通りです:

-   IndexBasedSpellCheckerスペルチェック用の並列索引のソースとしてSolrインデックスを使用してください。インデックス用語の基礎としてフィールドを定義しなければなりません。
-   DirectSolrSpellChecker:Solr指数の項を並列インデックス作成せずに使用します。
-   FileBasedSpellChecker:外部ファイルをスペリング辞書として使用してください。
-   WordBreakSolrSpellChecker: 隣接するクエリ用語や複数の単語に分割する用語を組み合わせる

以下のベストプラクティスを推奨します:

-   IndexBasedSpellCheckを使う場合は、タイトルや本文などの一部のフィールドからスペルチェック用に作成した別のフィールドに単語をコピーしてください。
-   DirectSolrSpellCheckを使う場合は、スペルチェッカーのクエリフィールドを選ぶ際に、特にステミングなど分析が比較的少ないものを選びましょう。

[Solrのドキュメントには詳細が記載](https://cwiki.apache.org/confluence/display/solr/Spell+Checking)されています。

## ソルル構成

Solrの設定方法は2通りあります:

-   すべてのリクエストが提案を生成する場合は、既存の選択リクエストハンドラを使いましょう
-   スペルチェックの提案を提供するために専用のリクエストハンドラが必要な場合は、スペルリクエストハンドラを使用してください

Solrの設定はSolrConfig.xmlファイルを編集して行います。

### 既存のリクエストハンドラを使用

これにより、マスターインデックスの\_nameフィールドのスペルチェックが可能になります:

1.  例えばsolrconfig.xmlファイルを開いてみてください。C:\\solr-6.3.0\\server\\solr\\configsets\\sitecore\_core\_index\\conf\\solrconfig.xml。
2.  <arr name="components">ノードを見つけて有効にしてください。デフォルトでは無効になっています。
3.  <arr name="components">ノードに<str>spellcheck</str>を追加します。
4.  <searchComponent name="spellcheck" class="solr.SpellCheckComponent">ノードに行ってください。
5.  <lst name="spellchecker">ノードの下で、<str name="field">\_text\_</str>を<str name="field">\_name</str>に変更して\_nameフィールドのスペルチェックを有効にします。

動作を確認するために:

1.  ブラウザでSolr Adminを開き、コアインデックスを選択するか、このリンクから直接アクセスしてください:[http://localhost:8983/solr/#/sitecore\_core\_index/query](http://localhost:8983/solr/#/sitecore_core_index/query)
2.  スペ**ルチェック**のチェックボックスを選択してスペルチェックを有効にし、**spellcheck.q**のテキストフィールド(homt)にスペルチェッククエリを入力します。
3.  クエリ**を実行する**をクリックします。

Solrサーバーでスペルチェックが機能すれば、Solr Adminはこれに似ています:

![Using\_Solr\_spell\_checking-Picture\_6-rId11-185900573.png](https://doc.sitecore.com/api/markdown-image/xp/ja/developers/103/platform-administration-and-architecture/images/Using_Solr_spell_checking-Picture_6-rId11-185900573.png)

複数のSolrコアを使用する場合は、それぞれのコアで同じ手順を繰り返す必要があります。

### スペルリクエストハンドラの使用

これにより、マスターインデックスの\_nameフィールドのスペルチェッカーが可能になります:

1.  例えばsolrconfig.xmlファイルを開いてみてください。C:\\solr-6.3.0\\server\\solr\\configsets\\sitecore\_core\_index\\conf\\solrconfig.xml。
2.  <searchComponent name="spellcheck" class="solr.SpellCheckComponent">ノードを特定しろ。
3.  <lst name="spellchecker">ノードの下で、<str name="field">\_text</str>を<str name="field">\_name</str>に変更します。
4.  SolrConfig.xmlファイルを保存してSolrを再起動してください。

動作を確認するために:

1.  ブラウザでhttp://localhost:8983/solr/sitecore\_master\_index/spell?q=\_name:homy&amp;spellcheck=true&amp;spellcheck.count=10&amp;rows=100000000&amp;version=2.2&amp;spellcheck.build=true&amp;wt=json&amp;indent=trueに行ってください。

もしうまくいけば、回答は次のようになります:

![Using\_Solr\_spell\_checking-Picture\_9-rId13-483165845.png](https://doc.sitecore.com/api/markdown-image/xp/ja/developers/103/platform-administration-and-architecture/images/Using_Solr_spell_checking-Picture_9-rId13-483165845.png)

### オプション構成

Solrスペルチェッカー機能の他の多くの側面も設定できます。これらのパラメータは、solrconfig.xmlファイルのリクエストハンドラセクションでノードを追加して設定<lst name="defaults">ノードです。

例えば、このスニペットはデフォルトカウントとして20の値を付けたspellcheck.countを加算しています:

<requestHandler name="/select" class="solr.SearchHandler">
 <!-- default values for query parameters can be specified, these
 will be overridden by parameters in the request
 -->
 <lst name="defaults">
 <str name="echoParams">explicit</str>
 <int name="rows">10</int>
 <str name="spellcheck">true</str>
 <str name="spellcheck.count">20</str>

[https://cwiki.apache.org/confluence/display/solr/Spell+Checking](https://cwiki.apache.org/confluence/display/solr/Spell+Checking)はより詳細に書かれています。

## サンプルコード

このサンプルコードは、検索語が結果を得られなかった場合に提案リストを作成する方法を示しています。

例えば、ユーザーがhomyという用語を検索しても結果が出なかった場合、homyに近い提案のリストを返すことができます。home。

Sitecoreは、使用できる2つのAPIを公開しています:

-   もしコードがISolrQueryの実装を使っているなら、これを使ってください:
    
    SolrNetProxy.Query
    public static SolrQueryResults<T> Query<T>(this IProviderSearchContext context, ISolrQuery q, QueryOptions queryOptions)
    public static SolrQueryResults<T> Query<T>(this IProviderSearchContext context, string q, QueryOptions queryOptions)
    
-   もしコードがISolrQueryを使っていない場合は、これを使ってください。こちらの実装はより簡単です:
    
    SolrNetProxy.GetSpellCheck
    public static SolrQueryResults<Dictionary<string, object>> GetSpellCheck(this IProviderSearchContext context, ISolrQuery q, SpellCheckHandlerQueryOptions options)
    

以下の例は、SitecoreのSolrスペルチェッカーの2つの異なる使い方を示しています。

### SolrNetProxy.Queryの使用

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="HighlightDemo.aspx.cs" Inherits="Sitecore.ContentSearch.SolrProvider.Example.HighlightDemo" %>
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="HighlightDemo.aspx.cs" Inherits="Sitecore.ContentSearch.SolrProvider.Example.HighlightDemo" %>
<%@ Import Namespace="Sitecore.ContentSearch.SearchTypes" %>
<%@ Import Namespace="System" %>
<%@ Import Namespace="System.Collections.Generic" %>
<%@ Import Namespace="Sitecore.ContentSearch" %>
<%@ Import Namespace="Sitecore.ContentSearch.SolrNetExtension" %>
<%@ Import Namespace="Sitecore.ContentSearch.SolrProvider.SolrNetIntegration" %>
<%@ Import Namespace="SolrNet.Commands.Parameters" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
 <title></title>
 <script runat="server">
 protected void OnClick(object sender, EventArgs e)
 {
 FirstSenario();
 }
 private void FirstSenario()
 {
 var index = ContentSearchManager.GetIndex("sitecore\_master\_index");
 var searchText = this.txtInput.Text;
 if (string.IsNullOrEmpty(searchText))
 {
 //TODO prompt error
 this.ShowResult("Please enter a search text!");
 return;
 }
 using (var context = index.CreateSearchContext())
 {
 var results = context.Query<SearchResultItem>(string.Format("\_name:{0}", searchText), new QueryOptions()
 {
 SpellCheck = new SpellCheckingParameters()
 });
 if (results == null || results.SpellChecking == null || results.SpellChecking.Count < 1)
 {
 this.ShowResult("No rows returned");
 this.rptResults.DataSource = new List<string>();
 this.rptResults.DataBind();
 return;
 }
 var suggestions = new List<string>();
 foreach (var term in results.SpellChecking)
 {
 foreach (var suggestion in term.Suggestions)
 {
 suggestions.Add(suggestion);
 }
 }
 this.BindSuggestion(suggestions);
 }
 }
 private void ShowResult(string result)
 {
 this.divResult.InnerHtml = result;
 }
 private void BindSuggestion(List<string> suggestions)
 {
 this.rptResults.DataSource = suggestions;
 this.rptResults.DataBind();
 }
 </script>
</head>
<body>
 <form id="form1" runat="server">
 <div>
 <h3>Spell Check Example </h3>
 <h4>Group search result by title</h4>
 <br/>
 <asp:Label runat="server" Text="Name" AssociatedControlID="txtInput"></asp:Label> &nbsp; &nbsp;
 <asp:TextBox runat="server" ID="txtInput"></asp:TextBox> &nbsp; &nbsp;
 <asp:Button runat="server" Text="Search" OnClick="OnClick" />
 <br/>
 <div><b>Search Results</b></div>
 <br/>
 <div id="divResult" runat="server"></div>
 <asp:Repeater id="rptResults" runat="server">
 <HeaderTemplate>
 <table cols="1" width="100%" style="padding: 5px">
 </HeaderTemplate>
 <ItemTemplate>
 <tr>
 <td><%# Container.DataItem %></td>
 </tr>
 </ItemTemplate>
 <FooterTemplate>
 </table>
 </FooterTemplate>
 </asp:Repeater>
 </div>
 </form>
</body>
</html>

### SolrNetProxy.GetSpellCheckの使用

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="SpellCheckDemo.aspx.cs" Inherits="Sitecore.ContentSearch.SolrProvider.Example.SpellCheckDemo" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
 <title></title>
 <style>
 .resultBox {
 padding: 5px 5px 5px 5px;
 margin-bottom: 1px;

 }
 #divGroupFieldLists {
 border-style: dashed;
 }
 </style>
</head>
<body>
 <form id="form1" runat="server">
 <div>
 <h3>Spell Check Example </h3>
 <h4>Group search result by title</h4>
 <br/>
 <asp:Label runat="server" Text="Name" AssociatedControlID="txtInput"></asp:Label> &nbsp; &nbsp;
 <asp:TextBox runat="server" ID="txtInput"></asp:TextBox> &nbsp; &nbsp;
 <asp:Button runat="server" Text="Search" OnClick="OnClick" />
 <br/>
 <div><b>Search Results</b></div>
 <br/>
 <div id="divResult" runat="server"></div>
 <asp:Repeater id="rptResults" runat="server">
 <HeaderTemplate>
 <table cols="1" width="100%" style="padding: 5px">
 </HeaderTemplate>
 <ItemTemplate>
 <tr>
 <td><%# Container.DataItem %></td>
 </tr>
 </ItemTemplate>
 <FooterTemplate>
 </table>
 </FooterTemplate>
 </asp:Repeater>
 </div>
 </form>
</body>
</html>
SpellCheckDemo.aspx.cs
namespace Sitecore.ContentSearch.SolrProvider.Example
{
 using System;
 using System.Collections.Generic;
 using Sitecore.ContentSearch.SolrNetExtension;
 using Sitecore.ContentSearch.SolrProvider.SolrNetIntegration;
 using SolrNet.Commands.Parameters;
 using SolrNet;
 public partial class SpellCheckDemo : System.Web.UI.Page
 {
 protected void Page\_Load(object sender, EventArgs e)
 {
 }
 protected void OnClick(object sender, EventArgs e)
 {
 FirstSenario();
 }
 private void FirstSenario()
 {
 var index = ContentSearchManager.GetIndex("sitecore\_master\_index");
 var searchText = this.txtInput.Text;
 if (string.IsNullOrEmpty(searchText))
 {
 //TODO prompt error
 this.ShowResult("Please enter a search text!");
 return;
 }
 using (var context = index.CreateSearchContext())
 {
 var results = context.GetSpellCheck(new SolrQuery(string.Format("\_name:{0}", searchText)), new SpellCheckHandlerQueryOptions()
 {
 SpellCheck = new SpellCheckingParameters()
 {
 Count = 10,
 Build = true
 }
 });
 if (results == null || results.SpellChecking == null || results.SpellChecking.Count < 1)
 {
 this.ShowResult("No rows returned");
 this.rptResults.DataSource = new List<string>();
 this.rptResults.DataBind();
 return;
 }
 var suggestions = new List<string>();
 foreach (var term in results.SpellChecking)
 {
 foreach (var suggestion in term.Suggestions)
 {
 suggestions.Add(suggestion);
 }
 }
 this.BindSuggestion(suggestions);
 }
 }
 #region Helper Method
 private void ShowResult(string result)
 {
 this.divResult.InnerHtml = result;
 }
 private void BindSuggestion(List<string> suggestions)
 {
 this.rptResults.DataSource = suggestions;
 this.rptResults.DataBind();
 }
 #endregion
 }
}