نحوه اضافه کردن Auto-Complete به جستجوی لوسین در ASP.NET MVC و Web forms
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: هشت دقیقه

پیشنیازها:
چگونه با استفاده از لوسین مطالب را ایندکس کنیم؟
چگونه از افزونه jQuery Auto-Complete استفاده کنیم؟
نحوه استفاده صحیح از لوسین در ASP.NET


اگر به جستجوی سایت دقت کرده باشید، قابلیت ارائه پیشنهاداتی به کاربر توسط یک Auto-Complete به آن اضافه شده‌است. در مطلب جاری به بررسی این مورد به همراه دو مثال Web forms و MVC پرداخته خواهد شد.


قسمت عمده مطلب جاری با پیشنیازهای یاد شده فوق یکی است. در اینجا فقط به ذکر تفاوت‌ها بسنده خواهد شد.

الف) دریافت لوسین
از طریق NuGet آخرین نگارش را دریافت و به پروژه خود اضافه کنید. همچنین Lucene.NET Contrib را نیز به همین نحو دریافت نمائید.

ب) ایجاد ایندکس
کدهای این قسمت با مطلب برجسته سازی قسمت‌های جستجو شده، یکی است:
using System.Collections.Generic;
using System.IO;
using Lucene.Net.Analysis.Standard;
using Lucene.Net.Documents;
using Lucene.Net.Index;
using Lucene.Net.Store;
using LuceneSearch.Core.Model;
using LuceneSearch.Core.Utils;

namespace LuceneSearch.Core
{
    public static class CreateIndex
    {
        static readonly Lucene.Net.Util.Version _version = Lucene.Net.Util.Version.LUCENE_30;

        public static Document MapPostToDocument(Post post)
        {
            var postDocument = new Document();
            postDocument.Add(new Field("Id", post.Id.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
            var titleField = new Field("Title", post.Title, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS);
            titleField.Boost = 3;
            postDocument.Add(titleField);
            postDocument.Add(new Field("Body", post.Body.RemoveHtmlTags(), Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS));
            return postDocument;
        }

        public static void CreateFullTextIndex(IEnumerable<Post> dataList, string path)
        {
            var directory = FSDirectory.Open(new DirectoryInfo(path));
            var analyzer = new StandardAnalyzer(_version);
            using (var writer = new IndexWriter(directory, analyzer, create: true, mfl: IndexWriter.MaxFieldLength.UNLIMITED))
            {
                foreach (var post in dataList)
                {
                    writer.AddDocument(MapPostToDocument(post));
                }

                writer.Optimize();
                writer.Commit();
                writer.Close();
                directory.Close();
            }
        }
    }
}
تنها تفاوت آن اضافه شدن titleField.Boost = 3 می‌باشد. توسط Boost به لوسین خواهیم گفت که اهمیت عبارات ذکر شده در عناوین مطالب، بیشتر است از اهمیت متون آن‌ها.


ج) تهیه قسمت منبع داده Auto-Complete

namespace LuceneSearch.Core.Model
{
    public class SearchResult
    {
        public int Id { set; get; }
        public string Title { set; get; }
    }
}

using System.Collections.Generic;
using System.IO;
using Lucene.Net.Index;
using Lucene.Net.Search;
using Lucene.Net.Store;
using LuceneSearch.Core.Model;
using LuceneSearch.Core.Utils;

namespace LuceneSearch.Core
{
    public static class AutoComplete
    {
        private static IndexSearcher _searcher;

        /// <summary>
        /// Get terms starting with the given prefix
        /// </summary>
        /// <param name="prefix"></param>
        /// <param name="maxItems"></param>
        /// <returns></returns>
        public static IList<SearchResult> GetTermsScored(string indexPath, string prefix, int maxItems = 10)
        {
            if (_searcher == null)
                _searcher = new IndexSearcher(FSDirectory.Open(new DirectoryInfo(indexPath)), true);

            var resultsList = new List<SearchResult>();
            if (string.IsNullOrWhiteSpace(prefix))
                return resultsList;

            prefix = prefix.ApplyCorrectYeKe();

            var results = _searcher.Search(new PrefixQuery(new Term("Title", prefix)), null, maxItems);
            if (results.TotalHits == 0)
            {
                results = _searcher.Search(new PrefixQuery(new Term("Body", prefix)), null, maxItems);
            }

            foreach (var doc in results.ScoreDocs)
            {
                resultsList.Add(new SearchResult
                {
                    Title = _searcher.Doc(doc.Doc).Get("Title"),
                    Id = int.Parse(_searcher.Doc(doc.Doc).Get("Id"))
                });
            }

            return resultsList;
        }
    }
}
توضیحات:
برای نمایش Auto-Complete نیاز به منبع داده داریم که نحوه ایجاد آن‌را در کدهای فوق ملاحظه می‌کنید. در اینجا توسط جستجوی سریع لوسین و امکانات PrefixQuery آن، به تعدادی مشخص (maxItems)، رکوردهای یافت شده را بازگشت خواهیم داد. خروجی حاصل لیستی است از SearchResultها شامل عنوان مطلب و Id آن. عنوان را به کاربر نمایش خواهیم داد؛ از Id برای هدایت او به مطلبی مشخص استفاده خواهیم کرد.


د) نمایش Auto-Complete در ASP.NET MVC

using System.Text;
using System.Web.Mvc;
using LuceneSearch.Core;
using System.Web;

namespace LuceneSearch.Controllers
{
    public class HomeController : Controller
    {
        static string _indexPath = HttpRuntime.AppDomainAppPath + @"App_Data\idx";

        public ActionResult Index(int? id)
        {
            if (id.HasValue)
            {
                //todo: do something
            }
            return View(); //Show the page
        }

        public virtual ActionResult ScoredTerms(string q)
        {
            if (string.IsNullOrWhiteSpace(q))
                return Content(string.Empty);

            var result = new StringBuilder();
            var items = AutoComplete.GetTermsScored(_indexPath, q);
            foreach (var item in items)
            {
                var postUrl = this.Url.Action(actionName: "Index", controllerName: "Home", routeValues: new { id = item.Id }, protocol: "http");
                result.AppendLine(item.Title + "|" + postUrl);
            }

            return Content(result.ToString());
        }
    }
}

@{
    ViewBag.Title = "جستجو";
    var scoredTermsUrl = Url.Action(actionName: "ScoredTerms", controllerName: "Home");
    var bulletImage = Url.Content("~/Content/Images/bullet_shape.png");
}
<h2>
    جستجو</h2>

<div align="center">
    @Html.TextBox("term", "", htmlAttributes: new { dir = "ltr" })
    <br />
    جهت آزمایش lu را وارد نمائید
</div>

@section scripts
{
    <script type="text/javascript">
        EnableSearchAutocomplete('@scoredTermsUrl', '@bulletImage');
    </script>
}

function EnableSearchAutocomplete(url, img) {
    var formatItem = function (row) {
        if (!row) return "";
        return "<img src='" + img + "' /> " + row[0];
    }

    $(document).ready(function () {
        $("#term").autocomplete(url, {
            dir: 'rtl', minChars: 2, delay: 5,
            mustMatch: false, max: 20, autoFill: false,
            matchContains: false, scroll: false, width: 300,
            formatItem: formatItem
        }).result(function (evt, row, formatted) {
            if (!row) return;
            window.location = row[1];
        });
    });
}
توضیحات:
- ابتدا ارجاعاتی را به jQuery، افزونه Auto-Complete و اسکریپت سفارشی تهیه شده، در فایل layout پروژه تعریف خواهیم کرد.
در اینجا سه قسمت را مشاهده می‌کنید: کدهای کنترلر، View متناظر و اسکریپتی که Auto-Complete را فعال خواهد ساخت.
- قسمت مهم کدهای کنترلر، دو سطر زیر هستند:
result.AppendLine(item.Title + "|" + postUrl);
return Content(result.ToString());
مطابق نیاز افزونه انتخاب شده در مثال جاری، فرمت خروجی مدنظر باید شامل سطرهایی حاوی متن قابل نمایش به همراه یک Id (یا در اینجا یک آدرس مشخص) باشد. البته ذکر این Id اختیاری بوده و در اینجا جهت تکمیل بحث ارائه شده است.
return Content هم سبب بازگشت این اطلاعات به افزونه خواهد شد.
- کدهای View متناظر بسیار ساده هستند. تنها نام TextBox تعریف شده مهم می‌باشد که در متد جاوا اسکریپتی EnableSearchAutocomplete استفاده شده است. به علاوه، نحوه مقدار دهی آدرس دسترسی به اکشن متد ScoredTerms نیز مهم می‌باشد.
- در متد EnableSearchAutocomplete نحوه فراخوانی افزونه autocomplete را ملاحظه می‌کنید.
جهت آن، به راست به چپ تنظیم شده است. با 2 کاراکتر ورودی فعال خواهد شد با وقفه‌ای کوتاه. نیازی نیست تا انتخاب کاربر از لیست ظاهر شده حتما با عبارت جستجو شده صد در صد یکی باشد. حداکثر 20 آیتم در لیست ظاهر خواهند شد. اسکرول بار لیست را حذف کرده‌ایم. عرض آن به 300 تنظیم شده است و نحوه فرمت دهی نمایشی آن‌را نیز ملاحظه می‌کنید. برای این منظور از متد formatItem استفاده شده است. آرایه row در اینجا در برگیرنده اعضای Title و Id ارسالی به افزونه است. اندیس صفر آن به عنوان دریافتی اشاره می‌کند.
همچنین نحوه نشان دادن عکس العمل به عنصر انتخابی را هم ملاحظه می‌کنید (در متد result مقدار دهی شده).  window.location را به عنصر دوم آرایه row هدایت خواهیم کرد. این عنصر دوم مطابق کدهای اکشن متد تهیه شده، به آدرس یک صفحه اشاره می‌کند.


ه) نمایش Auto-Complete در ASP.NET WebForms

قسمت عمده مطالب فوق با وب فرم‌ها نیز یکی است. خصوصا توضیحات مرتبط با متد EnableSearchAutocomplete ذکر شده.
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="LuceneSearch.WebForms.Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width" />
    <title>جستجو</title>
    <link href="Content/Site.css" rel="stylesheet" type="text/css" />
    <script src="Scripts/jquery-1.7.1.min.js" type="text/javascript"></script>
    <script src="Scripts/jquery.autocomplete.js" type="text/javascript"></script>
    <script src="Scripts/custom.js" type="text/javascript"></script>
</head>
<body dir="rtl">
    <h2>
        جستجو</h2>
    <form id="form1" runat="server">
    <div align="center">
        <asp:TextBox runat="server" dir="ltr" ID="term"></asp:TextBox>
        <br />
        جهت آزمایش lu را وارد نمائید
    </div>
    </form>
    <script type="text/javascript">
        EnableSearchAutocomplete('Search.ashx', 'Content/Images/bullet_shape.png');
    </script>
</body>
</html>

using System.Text;
using System.Web;
using LuceneSearch.Core;

namespace LuceneSearch.WebForms
{
    public class Search : IHttpHandler
    {
        static string _indexPath = HttpRuntime.AppDomainAppPath + @"App_Data\idx";

        public void ProcessRequest(HttpContext context)
        {
            string q = context.Request.QueryString["q"];
            if (string.IsNullOrWhiteSpace(q))
            {
                context.Response.Write(string.Empty);
                context.Response.End();
            }

            var result = new StringBuilder();
            var items = AutoComplete.GetTermsScored(_indexPath, q);
            foreach (var item in items)
            {
                var postUrl = "Default.aspx?id=" + item.Id;
                result.AppendLine(item.Title + "|" + postUrl);
            }

            context.Response.ContentType = "text/plain";
            context.Response.Write(result.ToString());
            context.Response.End();
        }

        public bool IsReusable
        { get { return false; } }
    }
}

در اینجا بجای Controller از یک Generic handler استفاده شده است (Search.ashx).
result.AppendLine(item.Title + "|" + postUrl);
context.Response.Write(result.ToString());
در آن، عنوان مطالب یافت شده به همراه یک آدرس مشخص، تهیه و در Response نوشته خواهند شد.


کدهای کامل مثال فوق را از اینجا می‌توانید دریافت کنید:
همچنین باید دقت داشت که پروژه MVC آن از نوع MVC4 است (VS2010) و فرض براین می‌باشد که IIS Express 7.5 را نیز پیشتر نصب کرده‌اید.
کلمه عبور فایل: dotnettips91
 
  • #
    ‫۱۱ سال و ۹ ماه قبل، پنجشنبه ۷ دی ۱۳۹۱، ساعت ۱۶:۲۹
    ممنون از این مطلب مفید. آیا با استفاده روش فوق میشه چند جدول رو با هم ایندکس کرد؟
    • #
      ‫۱۱ سال و ۹ ماه قبل، پنجشنبه ۷ دی ۱۳۹۱، ساعت ۱۶:۳۳
      بله. در اینجا مشکلی با ثبت اطلاعات از چندین جدول مختلف، در یک ایندکس وجود ندارد. برای مدیریت جستجوی بهتر روی آن‌ها یک روش این است که در متد MapPostToDocument، فیلد دیگری را به نام مثلا TableName اضافه کنید تا بشود در حین جستجو از آن استفاده کرد.
      • #
        ‫۹ سال و ۹ ماه قبل، جمعه ۱۲ دی ۱۳۹۳، ساعت ۱۳:۵۸
        سلام. من برای ثبت چندتا جدول مختلف در یک ایندکس فیلد TableId هم گرفتم برای اینکه مشخص بشه سند مربوط به کدوم جدوله. حالا راهی هست که به جز Id فیلد دیگه ای هم برای بروزرسانی یا حذف یک سند ارسال کرد؟ مثلا با Id و TableId یه سند رو حذف یا بروزرسانی کرد نه با Id خالی.
        یعنی با این دستور:
        indexWriter.DeleteDocuments(new Term("Id", id.ToString()))
        مثلاً یه محصول داشته باشیم و یه مقاله با آیدی یکسان چجوری میشه؟
        • #
          ‫۹ سال و ۹ ماه قبل، جمعه ۱۲ دی ۱۳۹۳، ساعت ۱۴:۱۱
          متد DeleteDocuments یک کوئری هم قبول می‌کند:
          var query = new BooleanQuery();
          query.Add(new BooleanClause(new TermQuery(new Term("id", id.ToString(CultureInfo.InvariantCulture))), Occur.SHOULD));
          // query.Add(...
          // query.Add(...
          // ...
          writer.DeleteDocuments(query);
  • #
    ‫۱۱ سال و ۹ ماه قبل، دوشنبه ۲۵ دی ۱۳۹۱، ساعت ۱۷:۳۴
    من یک تکست باکس ایجاد کردم که از  همین Autocomplete شما استفاده میکنه. منتها یک دکمه جستجو هم قرار دادم که با کلیک کردن روی اون دوباره از لوسین استفاده میکنه و چندین رکورد رو هم بازگشت میده.
    اما چون باید یک سری رشته که نتیجه‌ی لوسین هست رو برگردونم از return Content استفاده میکنم ولی نتایج رو در یک صفحه‌ی جدید و بدون Master Page میاره.
    نحوه‌ی نمایش نتایج اطلاعات لوسین در یک View که حاوی یک Master Page هم هست چطوریه؟
    مثلا نتایج زیر همون تکست باکس نمایش داده بشه.
    آیا باید نوع اکشن چیز دیگه ای باشه؟
    • #
      ‫۱۱ سال و ۹ ماه قبل، دوشنبه ۲۵ دی ۱۳۹۱، ساعت ۱۷:۵۱
      نتیجه جستجوی لوسین مثلا در مطلب فوق لیستی از SearchResultها است. همین لیست را در اکشن متد بازگشت دهید. سپس در View متناظر یک حلقه درست کرده و حاصل را به صورت دلخواهی فرمت کنید.
      علت استفاده از return Content در مثال بالا، نیاز افزونه جی‌کوئری استفاده شده به خروجی ساده متنی است. در حالت‌های دیگر از return View معمولی استفاده کنید.
  • #
    ‫۱۱ سال و ۸ ماه قبل، پنجشنبه ۵ بهمن ۱۳۹۱، ساعت ۱۶:۱۵
    سلام آقای نصیری ممنون از اینکه اطلاعتتون رو در اختیار دیگران قرار میدید بنده از کد‌های بالا تویه سایتم استفاده کردم و جستجوی سایت مثل ساعت داره کار میکنه فقط تویه ظاهرش به مشکل برخوردم بنده میخوام اون box رو که اطلاعات توش نمایش داده میشه از سمت راست تکس باکس تراز بشه مثل همون عکسی که بالا گذاشتید از بنده از سمت چب تراز شده و یه سوال دیگه, اون عکس loading رو هنگام جستجو نمایش نمیده آدرس دهی اون هم درسته البته تکس باس بنده position:absolute  هستش نمیدونم ماله اینه که نمایش نمیده یا مثلا میره یه قسمت دیدگی از صفحه. ممنون میشم راهنمایی کنید.
    • #
      ‫۱۱ سال و ۸ ماه قبل، پنجشنبه ۵ بهمن ۱۳۹۱، ساعت ۱۶:۳۱
      این موارد را باید با اصلاح اسکریپت یا css مربوط به auto-complete مدیریت کنید.
      مثلا محل قرارگیری منوی بازشونده به صورت زیر مقدار دهی شده. این را در فایل jquery.autocomplete.js یافته و اصلاح کنید:
      left: offset.left - options.width + 125
      یا تصویر loading در css به نحو زیر تعیین شده:
      .ac_loading
      {
      background: white url('Images/indicator.gif') left center no-repeat;
      }
  • #
    ‫۱۱ سال و ۸ ماه قبل، دوشنبه ۹ بهمن ۱۳۹۱، ساعت ۲۱:۱۲
    سلام؛ من یه مشکلی دارم وقتی بعد از جستجو گزینه ای رو انتخاب می‌کنی صفحه refresh می‌شه و متن انتخاب شده پاک می‌شه میشه لطفا منو راهنمایی کنید مرسی
    • #
      ‫۱۱ سال و ۸ ماه قبل، دوشنبه ۹ بهمن ۱۳۹۱، ساعت ۲۱:۳۶
      بله. به همین نحو طراحی شده. زمانیکه یک گزینه انتخاب می‌شود، سطر زیر، کاربر را به صفحه متناظر هدایت می‌کند:
      window.location = row[1];
      این سطر در سمت کلاینت، مساوی Response.Redirect سمت سرور است. می‌تونید اینجا متن انتخابی رو به صورت مثلا یک کوئری استرینگ تعریف کنید و بعد در صفحه‌ای دیگر دریافت و نمایش بدید.
      • #
        ‫۱۱ سال و ۴ ماه قبل، یکشنبه ۱۹ خرداد ۱۳۹۲، ساعت ۱۲:۲۵
        ضمن خسته نباشید 
        اگر  نیاز داشته باشیم که بعد از انتخاب گزینه کاربر به صفحه دیگه هدایت نشه و فقط آیتم انتخابی در تکست باکس بمونه باید چه کاری انجام داد. مرسی
        • #
          ‫۱۱ سال و ۴ ماه قبل، یکشنبه ۱۹ خرداد ۱۳۹۲، ساعت ۲۱:۴۳
          سطر window.location رو حذف کنید.
  • #
    ‫۱۱ سال و ۸ ماه قبل، سه‌شنبه ۱۷ بهمن ۱۳۹۱، ساعت ۰۴:۳۵
    بسیار عالی بود . تنها یک مشکل برای من در ارتباط با کدهای آموزشی که برای استفاده از لوسین در اینترنت پیدا کردم وجود داره و اون هم اینکه در اونها کلاس و توابع به صورت استاتیک تعریف و در کنترلرها و یا کلاس‌های لایه سرویس فراخوانی شدن .
    این مسئله باعث اشکال در نوشتن آزمون واحد برای کنترلرها و یا متدها نمیشه ؟

    آیا در استاتیک معرفی کردن کلاس و توابع علت و مزیت خاصی وجود داره ؟
  • #
    ‫۱۱ سال و ۸ ماه قبل، شنبه ۲۱ بهمن ۱۳۹۱، ساعت ۲۳:۴۵
    با سلام
    امکانش هست که یه توضیح هم در مورد نحوه کار مستقیم با دیتابیس بدین؟
    کدام قسمت‌ها باید تغییر کتد و کدام قسمت‌ها باید حذف و اضافه شوند
    با تشکر
    • #
      ‫۱۱ سال و ۸ ماه قبل، یکشنبه ۲۲ بهمن ۱۳۹۱، ساعت ۰۰:۰۰
      لطفا اولین پیشنیاز عنوان شده را مطالعه کنید.
      • #
        ‫۱۱ سال و ۸ ماه قبل، یکشنبه ۲۲ بهمن ۱۳۹۱، ساعت ۰۳:۴۷
        با سلام مجدد؛  تمامی پیشنیاز‌های این مقاله را مطالعه کردم و خط به خط کدهای پروژه ای را که زحمت کشیدید و تهیه کرده اید را بررسی کردم.  شما در اولین پیشنیاز عنوان شده فرموده بودید "  کتابخانه Lucene مستقل است از منبع داده مورد استفاده و تنها اطلاعاتی با فرمت شیء Document معرفی شده به آن‌را می‌شناسد. " و در پروژه، در ابتدا کل داده‌ها را به یک document تبدیل کردید و سپس آنها را به IndexWriter اضافه کردید. و سپس جستجو‌های خود را روی این دیکشنری انجام می‌دادید.
        حالا سوال من این است: من در ابتدا باید تمامی اطلاعات را از طریق عنوان شده به یک فایل دیکشنری تبدیل کنم و هر مطلب جدید که اضافه میشود ، به این دیکشنری نیز اضافه شود ؟ اگر تعداد رکرود‌ها بالای میلیون باشد؟ راهی وجود ندارد که ما مستقیم به خود دیتابیس کار کنیم  ؟ و یا نه من ابتدا باید روی دیتابیس کلمه مورد نظر را جستجو کتم و پس از یافتن آن، آنرا به دیکشنری  اضافه کنم ؟ بهترین راه چیست که برای داده‌های بالا جوابگو باشد
        با تشکر فراوان
        • #
          ‫۱۱ سال و ۸ ماه قبل، یکشنبه ۲۲ بهمن ۱۳۹۱، ساعت ۰۴:۲۱
          - لوسین مستقل است از بانک اطلاعاتی. همچنین یکبار باید این ایندکس را تهیه کنید. اگر تعداد رکوردهای شما بالا است، فقط همان بار اول است که کار تهیه زمانبر خواهد بود. برای دفعات بعد در حد اضافه کردن چند سند لوسین به آن یا به روز رسانی و حذف است و کار دیگری ندارد.
          - پس از تهیه ایندکس، جستجوی لوسین کاری به بانک اطلاعاتی شما ندارد. بر روی ایندکس خودش انجام می‌شود و نیازی به جستجوی مجدد در بانک اطلاعاتی شما نیست. یک سیستم مستقل است.
          این روش متداول کار با لوسین است و حالت دیگری هم ندارد. این مستقل بودن هم یک مزیت است. برای مثال SQL Server CE یا خیلی از بانک‌های اطلاعاتی دیگر Full Text Search توکار ندارند. اینجا لوسین خوب جواب می‌ده.
          ضمن اینکه من در یک دمو استفاده از لوسین برای ایندکس کردن کل اطلاعات ویکی‌پدیا رو دیدم. تهیه ایندکس آن یک روز کار برده بوده (با توجه به حجم اطلاعات بالای ویکی پدیا)، اما جستجوی آن فوق العاده سریع و با کیفیت بود. این ویدیو رو در اینجا می‌تونید مشاهده کنید:
  • #
    ‫۱۱ سال و ۷ ماه قبل، چهارشنبه ۲ اسفند ۱۳۹۱، ساعت ۰۲:۰۰
    سلام آقای نصیری میخواستم ببینم آیا شما اطلاعی از نحوه غیر فعال کردم اینتر تویه این  پلاگین دارید بنده میخوام وقتی کاربر اینتر رو فشار داد جستجوی معمولی انجام بشه و اگه خواست از مواردی که توسط autocomplate براش آمده توسط موس یکی رو انتخاب کنه و به صفحه مربوطه هدایت بشه ممنون.
    • #
      ‫۱۱ سال و ۷ ماه قبل، چهارشنبه ۲ اسفند ۱۳۹۱، ساعت ۰۲:۱۹
      کلید enter با case KEY.RETURN در این افزونه جی‌کوئری مدیریت می‌شود.
  • #
    ‫۱۱ سال و ۷ ماه قبل، یکشنبه ۲۰ اسفند ۱۳۹۱، ساعت ۱۴:۲۵
    یک سوال خدمت شما داشتم اینکه :

    وقتی بخوایم از 2 جدول متفاوت جستجو کنیم به نظر شما اطلاعات هر جدول را جداگانه ایندکس کنیم(منظورم همان کاری که متد CreateFullTextIndex شما انجام میده) یا خیر؟
    البته منظور دو جدولی که با هم رابطه دارند.


    چندتا لینک در مورد لوسین:

      ممنون
    • #
      ‫۱۱ سال و ۷ ماه قبل، یکشنبه ۲۰ اسفند ۱۳۹۱، ساعت ۱۵:۰۲
      من همه رو داخل یک ایندکس ثبت می‌کنم. فقط یک فیلد اضافه‌تر به نام «نام جدول» مورد نظر نیاز هست تا بشود روی آن کوئری خاص گرفت یا اینکه کلا روی تمام رکوردها جستجو کرد به یکباره.
  • #
    ‫۱۰ سال و ۱۱ ماه قبل، شنبه ۲۷ مهر ۱۳۹۲، ساعت ۱۴:۲۵
    سلام؛ تویه اولین پیشنیاز‌ها که کار با لوسین رو گفته بودین توابعی مثله SearchByPartialWords  و Query و  غیره ایجاد شده ولی تو اینجا یه جور دیگه جستجو کردین توی ایندکس‌ها . میخواستم بدونم او توابع رو مگه واسه سرچ تو ایندکس‌ها ننوشتین؟ تازه اینجا شما دارین متن Title رو میفرستین سمت کاربر .  این highlight کردن عبارت جستجو شدش پس چی شد؟
    • #
      ‫۱۰ سال و ۱۱ ماه قبل، شنبه ۲۷ مهر ۱۳۹۲، ساعت ۱۵:۰۵
      - این هم یک روش دیگر هست. از آن روش‌های ذکر شده در پیشنیازها هم می‌توانید استفاده کنید.
      - highlight کردن عبارت جستجو شده در عنوان بازگشت داده شده، توسط افزونه auto-complete انجام می‌شود؛ خودکار است.
      • #
        ‫۱۰ سال و ۱۱ ماه قبل، شنبه ۲۷ مهر ۱۳۹۲، ساعت ۱۵:۱۶
        تو اون تابع Query که نوشتین یه دونه FastVectorHighlighter  ایجاد کردین . اگه highlight توسط  auto-complete خودکار  انجام میشه پس نقش این چیه؟ میشه بگین کدوم روش بهتره ؟ یا فرقی نمیکنه؟
        • #
          ‫۱۰ سال و ۱۱ ماه قبل، شنبه ۲۷ مهر ۱۳۹۲، ساعت ۱۵:۲۲
          دو بحث وجود داره:
          - برجسته سازی قسمتی از عبارت جستجو شده در لیست نمایش داده شده توسط افزونه auto-complete. این مورد خودکار است و توسط افزونه انجام می‌شود.
          - برجسته سازی قسمتی از عبارت جستجو شده در نتایج یک جستجوی کامل بعدی که قرار است highlight آن توسط ما با کدنویسی خاصی انجام شود. مراجعه کنید به این مطلب برای توضیحات بیشتر.
  • #
    ‫۱۰ سال و ۵ ماه قبل، دوشنبه ۲۲ اردیبهشت ۱۳۹۳، ساعت ۲۰:۲۶
    با سلام
    من از لوسین در asp.net web form استفاده کردم و کاملا هم راضی هستم . فقط یه مشکلی داشتم. اگه بخوام غیر از عبارت مورد نظر برای جستجو  یه مقدار دیگه رو هم بفرستم باید چکار کنم؟
    مثلا یه Dropdown داشته باشیم وبخواییم مثلا مقدار categoryid رو هم پاس بدیم تا به query مربوطه اضافه بشه.من dropdown  رو اضافه کردم اما مقدارش رو نمیشه در هندلر مربوط به Search دریافت کرد مثل q.
    • #
      ‫۱۰ سال و ۵ ماه قبل، دوشنبه ۲۲ اردیبهشت ۱۳۹۳، ساعت ۲۱:۵۶
      افزونه‌ی مورد استفاده در آن به نام jquery.autocomplete.js سورسش پیوست هست. ajax را در آن جستجو کنید به مورد ذیل خواهید رسید:
      $.ajax({
          //...
          data: $.extend({
                   q: lastWord(term),
                   limit: options.max
                   }, extraParams),
             //...
      });
      در اینجا q مشخص است و extraParams آن متغیر. بنابراین برای ارسال اطلاعات اضافی باید extraParams را مانند کدهای ذیل مقدار دهی کرد. نحوه‌ی دریافت عناصر آن در سمت سرور، مانند نحوه‌ی دریافت q است.
          $(document).ready(function () {
              $("#term").autocomplete(url, {
                  // ..... 
                  extraParams: { id: 12, xyz: "test" }
              }).result(function (evt, row, formatted) {
                  // .....
              });
          });
  • #
    ‫۱۰ سال و ۴ ماه قبل، چهارشنبه ۷ خرداد ۱۳۹۳، ساعت ۲۲:۴۱
    اگر بخوام لیستی که برای نتیجه جستجو باز میشه رو Custom  کنم مثلاً یه عکس بهش اضافه کنم یا یه جدول ساخته شده با HTML رو توش نشون بدم با یه سری جزئیات ، آیا امکان پذیره؟
    • #
      ‫۱۰ سال و ۴ ماه قبل، پنجشنبه ۸ خرداد ۱۳۹۳، ساعت ۰۰:۰۰
      نحوه سفارشی سازی هر آیتم لیست را در مطلب فوق، در متد formatItem می‌توانید مشاهده کنید.
      • #
        ‫۱۰ سال و ۳ ماه قبل، سه‌شنبه ۳ تیر ۱۳۹۳، ساعت ۱۵:۲۸
        با سلام؛ تکست باکسی که می‌خام جستجو از طریق اون انجام بشه در یک مستر پیج قرار داره و زمانی که صفحه و مستر پیج در یک پوشه قرار دارند مشکلی نیست ولی اگر صفحه در یک پوشه دیگر قرار گیرد جواب نمی‌ده. توضیح اینکه از متد ResolveClientUrl  هم استفاده کردم ولی جواب نداد :
           EnableSearchAutocomplete('<%=ResolveClientUrl( "~/Handlers/find.ashx")%>', '<%=ResolveClientUrl("Images/bullet_shape.png")%>');
          • #
            ‫۱۰ سال و ۳ ماه قبل، سه‌شنبه ۳ تیر ۱۳۹۳، ساعت ۲۳:۰۱
            با تشکر از پاسخ شما ،  id درست بود و با فایرباگ هم بررسی کردم و خطای زیر رو می‌داد :
            TypeError: $(...).autocomplete is not a function
            • #
              ‫۱۰ سال و ۳ ماه قبل، سه‌شنبه ۳ تیر ۱۳۹۳، ساعت ۲۳:۲۴
              این خطا یعنی اسکریپت‌های اصلی به صفحه پیوست نشده‌اند. برای تعریف آن‌ها هم از ResolveClientUrl استفاده کنید:
              <script type="text/javascript" src='<%: ResolveClientUrl("~/path....") %>'></script>
  • #
    ‫۹ سال و ۶ ماه قبل، پنجشنبه ۲۸ اسفند ۱۳۹۳، ساعت ۱۵:۴۹
    با سلام
    آیا در حال حاضر این روش همچنان روش بهینه و مناسبی برای جستجوی auto-complete است؟یا روش‌های جدیدتری هم وجود دارند؟(تاریخ انتشار این کتابخانه 2012 بوده است)
    با تشکر
  • #
    ‫۹ سال و ۴ ماه قبل، یکشنبه ۱۰ خرداد ۱۳۹۴، ساعت ۱۲:۱۲
    من از این روش استفاده کردم. یه مشکلی که هست، "ک" و "ی" و "ه" رو که تایپ می‌کنم به عنوان خروجی چیزی بهم نمیده. با اینکه توی عنوان مطالب سایت کلمات مرتبط هستند.
    • #
      ‫۹ سال و ۴ ماه قبل، یکشنبه ۱۰ خرداد ۱۳۹۴، ساعت ۱۴:۰۹
      - یکبار لیست stop words معرفی شده را بررسی کنید. stop words کلمات و یا حروفی هستند که در full text search، ایندکس نخواهند شد.
      - بحث یکسان سازی ی و ک فارسی و عربی را بررسی کنید.
      - همچنین با استفاده از برنامه‌ی luke بررسی کنید که چه چیزی ایندکس شده.
  • #
    ‫۵ سال و ۹ ماه قبل، سه‌شنبه ۲۰ آذر ۱۳۹۷، ساعت ۱۱:۲۳
    با سلام؛ آیا برای  mvc core کتابخانه فوق توسعه داده شده؟
  • #
    ‫۵ سال و ۸ ماه قبل، چهارشنبه ۲۶ دی ۱۳۹۷، ساعت ۱۹:۱۹
    ممنونم؛ فقط اگه میشه کد تابع ApplyCorrectYeKe  رو و یا لینکش رو بذارید.
    • #
      ‫۵ سال و ۸ ماه قبل، چهارشنبه ۲۶ دی ۱۳۹۷، ساعت ۲۱:۰۱
      فایل zip حاوی کدهای کامل بحث در انتهای آن پیوست شده و یا از کتابخانه‌ی DNTPersianUtils.Core استفاده کنید.