Merhaba arkadaşlar bugün sizlere SharePoint ortamında server side olarak “KeywordQuery” kullanarak nasıl sharepoint search servisini kullanarak sorgu atıp gelen sonuçları alabileceğinizden bahsedeceğim.
İlk olarak oluşturduğumuz projeye “Microsoft.Office.Server.Search” referansını ekliyoruz.
Oluşturduğumuz webpartımızın ascx tarafında arama textbox ımızı, butonumuzu ve sonuçların listeleneceği repeater kontrollerimizi ekliyoruz.
1 2 3 4 5 6 7 8 |
<asp:TextBox ID="searchText" runat="server"></asp:TextBox> <asp:Button ID="btnSearch" runat="server" OnClick="btnSearch_Click" Text="Search" /> <asp:Repeater ID="rptSearch" runat="server"> <ItemTemplate> <p><a href="<%# Eval("Url") %>"><%# Eval("Title") %></a></p> </ItemTemplate> </asp:Repeater> |
Daha sonra code behind tarafına geçerek burada sonuçlarımıza uygun bir sınıf oluşturuyoruz.
1 2 3 4 5 |
public class SearchResult { public string Title { set; get; } public string Url { set; get; } } |
Sonrasında ascx tarafında otamatik oluşturmuş olduğumuz “btnSearch_Click” eventımızın içine giderek kodumuzu yazmaya devam ediyoruz.
İlk olarak sitemizde arama yaptıracağımız için SPSite ile site bağlantımızı yapmamız gerekmektedir.
1 |
SPSite site = SPContext.Current.Site; |
Bu tanımlamadan sonra ilk olarak sorgu parametrelerini tanımlamak için “KeywordQuery” değişkenimizi oluşturuyoruz.
1 |
KeywordQuery kq = new KeywordQuery(site); |
Bu parametremiz için gerekli olan ve kullanacağımız SourceId, QueryText, SelectProperties ve RowLimit parametrelerine gerekli atamalarımızı yapıyoruz. Bu örnekte sadece bu kadar parametre kullanma ihtiyacı duydum siz bunların sayısını da arttırabilirsiniz ihtiyacınıza uygun olarak.
1 2 3 4 5 |
kq.SourceId = new Guid("8413cd39-2156-4e00-b54d-11efd9abdb89"); kq.QueryText = "* " + searchText.Text; kq.SelectProperties.Add("Title"); kq.SelectProperties.Add("Path"); kq.RowLimit = 20; |
Bu kısımda:
SourceId kısmında verdiğimiz Guid id’si aslında daha önceki SharePoint PNP JS Core Search Yapısında Arama Yapılmasını İstediğimiz Alanı Özelleştirmemize Yarayan ‘SourceId’ Parametre Değerleri ve Karşılıkları yazımda da bahsettiğim gibi genel arama kriterlerinden bahsedeceğim için bu id tanımlanmıştır.
QueryText parametresinde ise başta yıldız olmasının sebebi sql command’ta olduğu gibi girilen text değerinin bire bir değil içinde geçenleri de aramasını sağlamaktadır. Bu alana path vs gibi filtrelerde eklenebilmektedir. Search webpartında yer alan query kısmındaki tüm özellikleri desteklemektedir. Ekstra olarak textboxtan gelen değeri aratmak istediğim için bu alandaki text değerini de buraya ekledim.
SelectProperties kısmında ise gelmesini istediğimiz değerleri ekliyoruz. Burada sadece Title ve Path bilgilerinin gelmesini istediğim için bu ik değeri ekledim. İsteğe göre arttırabilirsiniz.
Gerekli ayarlamalarımızı yaptıktan sonra sorgumuzu atabiliriz. Aşağıdaki gibi “SearchExecutor” ile sorgumuzu atıyoruz.
ResultTableCollection resultTables = new SearchExecutor().ExecuteQuery(kq);
Sorgumuz sonucu bize “ResultTableCollection” tipinde gelecektir buradan işimize yarayacak datatable tablosunu almamız gerekmektedir.
DataTable resultDataTable = resultTables.FirstOrDefault().Table;
Buradan sonra bu tablo içerisinde gezerek kullanacağımız değerleri modellimiz formatına getirerek toplamamız gerekmektedir. Bu modelleri toplayabilmek için oluşturduğumuz model türünde liste oluşturuyoruz.
1 |
List<SearchResult> searchResultList = new List<SearchResult>(); |
Sonuç tablomuz üzerinde gezerek modelleri oluşturup model listemize ekliyoruz.
1 2 3 4 5 6 7 8 9 |
foreach (DataRow row in resultDataTable.Rows) { SearchResult searchResult = new SearchResult(); searchResult.Title = row["Title"].ToString(); searchResult.Url = row["Path"].ToString(); searchResultList.Add(searchResult); } |
Arama sonuçlarımızın istediğimiz modele uygun şekile getirilmiş bir halde elimiz de bir listemiz yer almaktadır. Şimdide bu listeyi ekranda görebilmek için repeater a bind ediyoruz.
1 2 |
rptSearch.DataSource = searchResultList; rptSearch.DataBind(); |
Gördüğünüz gibi bu şekilde sharepoint search alt yapısını kullanarak kendi arama uygulamamızı yazmış olduk.
Kodun tamamını bir verecek olursak aşağıdaki gibi bir code behind olacaktır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
using Microsoft.Office.Server.Search.Query; using Microsoft.SharePoint; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Web.UI; namespace GetSharePointSearchResult.GetSharePointSearchResult { public partial class GetSharePointSearchResultUserControl : UserControl { protected void Page_Load(object sender, EventArgs e) { } protected void btnSearch_Click(object sender, EventArgs e) { SPSite site = SPContext.Current.Site; KeywordQuery kq = new KeywordQuery(site); kq.SourceId = new Guid("8413cd39-2156-4e00-b54d-11efd9abdb89"); kq.QueryText = "* " + searchText.Text; kq.SelectProperties.Add("Title"); kq.SelectProperties.Add("Path"); kq.RowLimit = 20; ResultTableCollection resultTables = new SearchExecutor().ExecuteQuery(kq); DataTable resultDataTable = resultTables.FirstOrDefault().Table; List<SearchResult> searchResultList = new List<SearchResult>(); foreach (DataRow row in resultDataTable.Rows) { SearchResult searchResult = new SearchResult(); searchResult.Title = row["Title"].ToString(); searchResult.Url = row["Path"].ToString(); searchResultList.Add(searchResult); } rptSearch.DataSource = searchResultList; rptSearch.DataBind(); } public class SearchResult { public string Title { set; get; } public string Url { set; get; } } } } |
Sitemizde yer alan default arama ekranından arama yaptığımız da gelen sonuç ekranı aşağıdaki gibidir.
Birde yazdığımız arama webpartında aynı aramayı yapalım.
Gördüğünüz gibi aynı sonuçları getirmektedir.
Projenin tamamını aşağıdaki github linkindende indirebilirsiniz.
İlk Yorumu Siz Yapın