Solr空間検索の使用

Version:
日本語翻訳に関する免責事項

このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。

メモ

このトピックはSitecore 9.0以降で有効です。

SitecoreのSolr空間検索機能の一部を使用できます。空間検索は、次の目的で使用します。

  • インデックスポイントを検索します(緯度、経度の形式を使用)

  • 円またはバウンディングボックスに基づいて検索結果をフィルタリングする

  • ポイント間の距離でスコアリングを並べ替えるまたはブーストする

Sitecoreは、インデックス作成と検索のためにSolrのSpatialRecursivePrefixTreeFieldTypeタイプ (略してRPT) をサポートしています。インデックス ポイントを保存するためのSitecoreテンプレートがmasterデータベース/sitecore/templates/System/Geospatial/Coordinateつあります。Coordinateテンプレートには、LatitudeLongitudeの2つのフィールドがあります。このテンプレートからアイテムを作成すると、座標はSolrでインデックス化されます。

使う

次のコード例は、Sitecore LINQクエリを使用して、クアラルンプール市中心部 (座標3.156230と101.713614) から半径10キロメートル以内にあるポイントのリストを検索する方法を示しています。

context.GetQueryable < SearchResultItem > ()
    .WithinRadius(s => s.Location, new Coordinate(3.156230, 101.713614), 10)

The WithinRadius API

このAPIには、次の3つのパラメーターがあります。

  1. ポイントの座標を含むプロパティ。このプロパティをIndexField("coordinate") としてマークし、Coordinateクラスを返す必要があります。

    例えば:

    /// <summary>Gets or sets the coordinate of POI.</summary>

    IndexField("coordinate")

    DataMember

    public Coordinate Location { get; set; }

  2. 特定の距離内にある他のポイントを検索するときに使用する中心点の座標。

  3. 指定した中心点の座標から一定の距離内にある点を検索するために使用される半径。

4番目の省略可能なパラメーターがあります。これを使用して、Solrが円内ではなく境界ボックス内の点を検索するかどうかを指定します。

Sitecore LINQクエリの順序を使用して、昇順 (デフォルト) または降順の距離で順序付けられたポイントを返すことができます。

var queryable = context.GetQueryable < SearchResultItem > ()
    .OrderByDistance(s => s.Location, "3.156230, 101.713614");
var queryable = context.GetQueryable < SearchResultItem > ()
    .OrderByDistanceDescending(s => s.Location, "3.156230, 101.713614");

WithinRadius APIをOrderByDistance APIまたはOrderByDistanceDescending APIと組み合わせて、指定した半径内にあるポイントのリストを取得できます。結果は、次の例のように、中心点への近さの昇順または降順で並べ替えられます。

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WithinRadius.aspx.cs" Inherits="Sitecore.ContentSearch.SolrProvider.Example.WithinRadius" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    </div>
    </form>
</body>
</html>

WithinRadius.aspx.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Sitecore.ContentSearch.Data;
using Sitecore.ContentSearch.Linq;
using Sitecore.ContentSearch.SearchTypes;
namespace Sitecore.ContentSearch.SolrProvider.Example {
    public partial class WithinRadius : System.Web.UI.Page {
        protected void Page_Load (object sender, EventArgs e) {
            var index = ContentSearchManager.GetIndex ("sitecore_master_index");
            var htmlBuilder = new StringBuilder ();
            using (var context = index.CreateSearchContext ()) {
                var queryable = context.GetQueryable<SearchResultItem> ()
                    .WithinRadius (s => s.Location, new Coordinate (3.156230, 101.713614), 10)
                    //.OrderByDistanceDescending(s => s.Location, "3.156230, 101.713614");
                    .OrderByDistance (s => s.Location, "3.156230, 101.713614");
                var list = queryable.ToList ();
                if (list.Count == 0) {
                    Response.Write ("<div style='color:red'>No POI within the radius</div>");
                    return;
                }
                htmlBuilder.AppendFormat ("Found {0} item within vicinity. <br/>", list.Count);
                htmlBuilder.Append ("<div><ul>");
                foreach (var item in list) {
                    htmlBuilder.AppendFormat ("<li>{0} : {1}</li>", item.Name, item.Location.ToString ());
                }
                htmlBuilder.Append ("</ul></div>");
                Response.Write (htmlBuilder);
            }
        }
    }
}
この記事を改善するための提案がある場合は、 お知らせください!