Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
 
vladyslavh
3 / 2 / 2
Регистрация: 24.01.2017
Сообщений: 52
1

Мульти-поиск на сайте

16.04.2018, 18:28. Просмотров 489. Ответов 8
Метки нет (Все метки)

Сделал на сайте поиск, но он работает лишь для одной категории (можно выбрать), а хотелось бы сделать его сразу для несколько. Например, что бы ввести область в одном поле, а в соседнем город и поиск работал бы соответственно по обеим полям. На фото я скинул, как сейчас выглядит. Вот только был бы благодарен, если бы также помогли, как сделать так, что бы поиск был не только с начала слова а из любого места его, потому как для последней категории так как нужно вводить все целиком, что не очень удобно для конечного пользователя. Например: ввести только дизайн, и ему отобразит, что есть.
Итак:
1) поиск по несколько категорий одновременно
2) поиск с любого места предложения а не только с его начала
3) возможно какой-то combo box для любой из категорий, пример выбор области (по желанию)

Контролер
C#
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
    public class SearchController : Controller
    {
        EFDbContext db = new EFDbContext();
        public ActionResult Index()
        {
            return View(db.Colleges.ToList());
        }
 
        public JsonResult GetSearchingData(string SearchBy, string SearchValue)
        {
            List<College> CollegeList = new List<College>();
            if (SearchBy == "Educational_institution")
            {
                try
                {
                    CollegeList = db.Colleges.Where(x => x.Educational_institution.StartsWith(SearchValue) || SearchValue == null).ToList();
                }
                catch (FormatException)
                {
                    Console.WriteLine("{0} Is Not A Educational_institution ", SearchValue);
                }
                return Json(CollegeList, JsonRequestBehavior.AllowGet);
            }
            if (SearchBy == "Region")
            {
                try
                {
                    CollegeList = db.Colleges.Where(x => x.Region.StartsWith(SearchValue) || SearchValue == null).ToList();
                }
                catch (FormatException)
                {
                    Console.WriteLine("{0} Is Not A Region ", SearchValue);
                }
                return Json(CollegeList, JsonRequestBehavior.AllowGet);
            }
            if (SearchBy == "Settlement")
            {
                try
                {
                    CollegeList = db.Colleges.Where(x => x.Settlement.StartsWith(SearchValue) || SearchValue == null).ToList();
                }
                catch (FormatException)
                {
                    Console.WriteLine("{0} Is Not A Settlement ", SearchValue);
                }
                return Json(CollegeList, JsonRequestBehavior.AllowGet);
            }
            if (SearchBy == "State")
            {
                try
                {
                    CollegeList = db.Colleges.Where(x => x.State.StartsWith(SearchValue) || SearchValue == null).ToList();
                }
                catch (FormatException)
                {
                    Console.WriteLine("{0} Is Not A State ", SearchValue);
                }
                return Json(CollegeList, JsonRequestBehavior.AllowGet);
            }
            if (SearchBy == "Type_of_higher_education")
            {
                try
                {
                    CollegeList = db.Colleges.Where(x => x.Type_of_higher_education.StartsWith(SearchValue) || SearchValue == null).ToList();
                }
                catch (FormatException)
                {
                    Console.WriteLine("{0} Is Not A Type_of_higher_education ", SearchValue);
                }
                return Json(CollegeList, JsonRequestBehavior.AllowGet);
            }
            else
            {
                CollegeList = db.Colleges.Where(x => x.Specialties.StartsWith(SearchValue) || SearchValue == null).ToList();
                return Json(CollegeList, JsonRequestBehavior.AllowGet);
            }
 
        }
 
    }
Предствление

C#
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
@model IEnumerable<Domain.Entities.College>
<br /><br />
<div class="container">
    <b>Пошук за : </b>
    <select id="SearchBy">
        <option value="Educational_institution">Назва коледжа</option>
        @*<option value="Level_of_accreditation">Рівень акредитації</option>*@
        <option value="Region">Область</option>
        <option value="Settlement">Місто</option>
        <option value="State">Навчальний заклад</option>
        <option value="Type_of_higher_education">Тип ВНЗ</option>
        @*<option value="Specialties">Спеціальності</option>*@
        
    </select><br /><br />
    @Html.TextBox("Search")<input type="submit" id="SearchBtn" value="Search" /><br /><br />
    <table class="table table-bordered">
        <thead>
            <tr>
                <th>Назва коледжа</th>
                <th>Рівень акредитації</th>
                <th>Область</th>
                <th>Місто</th>
                <th>Навчальний</th>
                <th>Тип ВНЗ</th>
                <th>Спеціальності</th>
            </tr>
        </thead>
        <tbody id="DataSearching">
            @foreach (var Item in Model)
            {
                <tr>
                    <td>@Item.Educational_institution</td>
                    <td>@Item.Level_of_accreditation</td>
                    <td>@Item.Region</td>
                    <td>@Item.Settlement</td>
                    <td>@Item.State</td>
                    <td>@Item.Type_of_higher_education</td>
                    <td>@Item.Specialties</td>
                </tr>
            }
 
        </tbody>
    </table>
</div>
@*<script src="~/Scripts/jquery-1.10.2.min.js"></script>*@
<script src="~/Scripts/jquery-3.3.1.min.js"></script>
<script>
    $(document).ready(function () {
        $("#Search").keyup(function () {
            var SearchBy = $("#SearchBy").val();
            var SearchValue = $("#Search").val();
            var SetData = $("#DataSearching");
            SetData.html("");
            $.ajax({
                type: "post",
                url: "/Search/GetSearchingData?SearchBy=" + SearchBy + "&SearchValue=" + SearchValue,
                contentType: "html",
                success: function (result) {
                    if (result.length == 0) {
                        SetData.append('<tr style="color:red"><td colspan="3">No Match Data</td></tr>')
                    }
                    else {
                        $.each(result, function (index, value) {
                            var Data = "<tr>" +
                                "<td>" + value.Educational_institution + "</td>" +
                                 "<td>" + value.Level_of_accreditation + "</td>" +
                                "<td>" + value.Region + "</td>" +
                                "<td>" + value.Settlement + "</td>" +
                                "<td>" + value.State + "</td>" +
                                "<td>" + value.Type_of_higher_education + "</td>" +
                                "<td>" + value.Specialties + "</td>" +
                                "</tr>";
                            SetData.append(Data);
 
                        });
                    }
                }
            });
        });
    });
</script>
0
Миниатюры
Мульти-поиск на сайте  
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.04.2018, 18:28
Ответы с готовыми решениями:

Поиск на сайте по БД
У меня есть БД в которой хранится уникальный идентификатор товара и его название а также...

Поиск на сайте
Всем привет, я потихоньку пытаюсь разобраться в PHP, но возник один вопрос, на который я пока что...

Поиск на сайте
Добрый день, хотел бы узнать, можно ли сделать на html сайте поиск, как это сделать, есть ли...

Поиск на сайте
Здравствуйте! Возникла проблема с установкой формы поиска по сайту. Порекомендуйте какой то готовый...

Поиск на сайте
Здравствуйте! Помогите пожалуйста, у меня такой вопрос: Я делаю поиск на сайте, у меня есть...

8
lvlkoo
.NET C#,ASP.NET MVC
Эксперт .NET
549 / 471 / 213
Регистрация: 16.10.2010
Сообщений: 1,864
Завершенные тесты: 2
19.04.2018, 17:57 2
Цитата Сообщение от vladyslavh Посмотреть сообщение
1) поиск по несколько категорий одновременно
Надеюсь я правильно понял Вас. Вам просто нужно убрать этот выбор, и проверять сразу все что нужно.

C#
1
CollegeList = db.Colleges.Where(x => x.Settlement.StartsWith(SearchValue) || x.Educational_institution.StartsWith(SearchValue) || x.Region.StartsWith(SearchValue) || SearchValue == null).ToList();
И т.д, просто добавляет проверку по тем полям по которым должен работать Ваш поиск

Цитата Сообщение от vladyslavh Посмотреть сообщение
поиск с любого места предложения а не только с его начала
Заместо StartsWith используйте функцию Contains
1
IamRain
1543 / 1294 / 407
Регистрация: 02.08.2011
Сообщений: 3,822
19.04.2018, 18:48 3
Цитата Сообщение от lvlkoo Посмотреть сообщение
Вам просто нужно убрать этот выбор, и проверять сразу все что нужно.
Насколько я понял, сложный поиск (я называю это так) ищет объекты, которые удовлетворяют всем условиям, а не какому-то одному из условий.
lvlkoo, я бы написал расширение для IQuerable/IEnumerable, которое принимает на вход фильтр, и выдает результат, и последовательно применил бы фильтры к исходной коллекции. У вас же в результирующую коллекцию помещается то, что удовлетворяет хотя бы одному из условий.

vladyslavh, что-то типа того:
C#
1
2
3
4
5
IQuerable source = context.Entities;
// FilterBy - расширение для IQuerable
var result = source.FilterBy(d => d.ducational_institution.Contains("blabla"));
result = source.FilterBy(d => ...);
// и т.д.
Я бы еще создал CollegeComplexFilter и интерфейс ICollegeFilteringProvider:
C#
1
2
3
4
5
6
7
8
9
class CollegeComplexFilter
{
   // тут все свойства по которым фильтруем
}
 
interface ICollegeFilteringProvider
{
   IQuerable Filter(CollegeComplexFilter filter);
}
И нужным репозиторием реализовал бы этот интерфейс.
1
lvlkoo
.NET C#,ASP.NET MVC
Эксперт .NET
549 / 471 / 213
Регистрация: 16.10.2010
Сообщений: 1,864
Завершенные тесты: 2
19.04.2018, 19:08 4
Цитата Сообщение от IamRain Посмотреть сообщение
что удовлетворяет хотя бы одному из условий.
Эм.. Ну да, а разве не так должно быть в поиске по строковому ключу ?

Все равно в итоге все сведется к одному SQL запросу в виде a like '%string%' or b like '%string%'

Считаю, что писать расширение в данном случае это слишком сахарный сахар
0
19.04.2018, 19:08
IamRain
1543 / 1294 / 407
Регистрация: 02.08.2011
Сообщений: 3,822
19.04.2018, 19:13 5
Эм, ну если как полнотекстовый поиск (ввод в одно поле), то все ок.

А если так:
Цитата Сообщение от vladyslavh Посмотреть сообщение
что бы ввести область в одном поле, а в соседнем город и поиск работал бы соответственно по обеим полям
То есть это сложный поиск, а не полнотекстовый. Вроде правильно понял.
0
lvlkoo
.NET C#,ASP.NET MVC
Эксперт .NET
549 / 471 / 213
Регистрация: 16.10.2010
Сообщений: 1,864
Завершенные тесты: 2
19.04.2018, 19:18 6
Все может быть, на самом деле сложно понять
0
sau
2161 / 1728 / 299
Регистрация: 22.07.2011
Сообщений: 6,550
Завершенные тесты: 1
19.04.2018, 19:20 7
Было бы правильней использовать FullTextSearch в MSSQL , но для EF придется писать свое расширение под это дело.
0
vladyslavh
3 / 2 / 2
Регистрация: 24.01.2017
Сообщений: 52
20.04.2018, 15:56  [ТС] 8
Очень благодарен за ответы, попытаюсь более детальнее раскрыть свою цель: сейчас у меня реализован поиск по одной категории (изображение 1) и мы можем переключать ее, что бы выбрать другую категорию (изображение 1.2), но одновременно по двух поиск сделать не вышло, это должно выглядеть что-то вроде бы фильтра. На изображении №3 видим текст, я хочу создать например 2 поля для ввода данных (покажу на изображении №2 а также оно имеется в самом первом моем сообщении) для фильтрации, например выберем в первой категории область - Винницкую, данные отфильтруются, что бы все были Винницкие, а во втором поле я введу Бар, и тогда данные отфильтруются так, что бы были колледжи с Винницкой области а именно с города Бар.
0
Миниатюры
Мульти-поиск на сайте   Мульти-поиск на сайте  
Изображения
  
vladyslavh
3 / 2 / 2
Регистрация: 24.01.2017
Сообщений: 52
25.04.2018, 19:02  [ТС] 9
Вопрос еще актуален, хотелось бы помощи реализовать как подал в предыдущим сообщении.
0
25.04.2018, 19:02
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2018, 19:02

Поиск на сайте
Как реализовать так чтобы через календарики вводишь промежуток времени какое тебе надо, и если...

Поиск на сайте
Когда уже будет организован пойск, который распознавал бы не только латиницу, но и кириллицу ? без...

Поиск на сайте $like
Всем привет! В общем у меня такая проблема, вчера по одному из уроков сделал себе поиск на сайт,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru