Chosen: "Нечеткий" поиск слов

Созданный на 12 окт. 2012  ·  25Комментарии  ·  Источник: harvesthq/chosen

Привет,

Я тоже разработчик, которого недавно выбрали, и я поражен вашим решением. Я столкнулся с парой проблем с фильтрующим текстом, которые мне удалось решить и изменить пару строк в вашем коде. Я не знаю, может ли это вас заинтересовать, и вы хотели бы, чтобы это было объединено с вашим кодом. Позвольте мне описать проблему и показать вам разницу в моих изменениях.

Проблема, с которой я столкнулся, заключалась в том, чтобы искать больше, чем слово. Например, если вы зайдете на свой демонстрационный сайт, вставьте текст «bosnia herz» в поле выбора страны, и вы увидите, что ничего не соответствует, потому что вы ищете именно ту строку, которую я ввел. Также нельзя вводить слова в неправильном порядке или только части слов («uni sta»).

Мне бы очень хотелось иметь такой «нечеткий» фильтр, и мне удалось изменить выбранную версию jquery, чтобы просто сделать это. Разница:

diff --git a/chosen/chosen.jquery.js b/chosen/chosen.jquery.js
index 3e559e2..3799d41 100644
--- a/chosen/chosen.jquery.js
+++ b/chosen/chosen.jquery.js
@@ -792,6 +792,7 @@ Copyright (c) 2011 by Harvest
       this.no_results_clear();
       results = 0;
       searchText = this.search_field.val() === this.default_text ? "" : $('<div/>').text($.trim(this.search_field.val())).html();
+      var words = searchText.toLowerCase().split(' ');
       regexAnchor = this.search_contains ? "" : "^";
       regex = new RegExp(regexAnchor + searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
       zregex = new RegExp(searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
@@ -802,32 +803,20 @@ Copyright (c) 2011 by Harvest
           if (option.group) {
             $('#' + option.dom_id).css('display', 'none');
           } else if (!(this.is_multiple && option.selected)) {
-            found = false;
             result_id = option.dom_id;
             result = $("#" + result_id);
-            if (regex.test(option.html)) {
-              found = true;
-              results += 1;
-            } else if (option.html.indexOf(" ") >= 0 || option.html.indexOf("[") === 0) {
-              parts = option.html.replace(/\[|\]/g, "").split(" ");
-              if (parts.length) {
-                for (_j = 0, _len2 = parts.length; _j < _len2; _j++) {
-                  part = parts[_j];
-                  if (regex.test(part)) {
-                    found = true;
-                    results += 1;
-                  }
-                }
+            found = true;
+            for (var i_word = 0; i_word < words.length; ++i_word) {
+              if (option.html.toLowerCase().indexOf(words[i_word]) < 0) {
+                found = false;
+                break;
               }
             }
             if (found) {
-              if (searchText.length) {
-                startpos = option.html.search(zregex);
-                text = option.html.substr(0, startpos + searchText.length) + '</em>' + option.html.substr(startpos + searchText.length);
-                text = text.substr(0, startpos) + '<em>' + text.substr(startpos);
-              } else {
-                text = option.html;
-              }
+              results += 1;
+            }
+            if (found) {
+              text = option.html;
               result.html(text);
               this.result_activate(result);
               if (option.group_array_index != null) {

Я просто взломал версию jQuery, чтобы она работала на моем сайте. Я потерял возможность выделить текст, соответствующий фильтру, но меня это особо не заботило.

Если это может вас заинтересовать, я сделаю форк и отправлю запрос на перенос. Я даже верну основные моменты <em> .

Feature Request Search

Самый полезный комментарий

+1, это вопрос элементарной логики. «Uni Sta» должна найти «Соединенные Штаты».

Все 25 Комментарий

+1, это вопрос элементарной логики. «Uni Sta» должна найти «Соединенные Штаты».

+1 Безусловно, это нужно слить с

Добавлено как правильный запрос на перенос :

+1

Этот плагин отчаянно нуждается в нечетком поиске.

+1

+1 Это было бы очень полезно, какой статус при объединении запроса на перенос # 867

Я раздвоил репо, чтобы сделать именно это, решил, что сначала поищу проблему - +1 это нужно объединить !!

+1 спасибо за быстрый патч YANOUSHek

+1

Я перенес код jQuery, предложенный в текущий код CoffeScript, и внес некоторые изменения, чтобы подсветка работала: https://github.com/eliasdorneles/chosen
Что касается выделения результатов, я сделал самую простую вещь, которая могла работать, но для этого нужно немного доработать.

Пожалуйста, попробуйте и дайте мне знать, если у вас есть предложения! :)
Элиас

Я исправил проблемы с подсветкой, которые у меня были, теперь все в порядке, пожалуйста, проверьте это по адресу: https://github.com/eliasdorneles/chosen
Стоит ли открывать пул реквест?

@eliasdorneles да, пожалуйста. Это значительно упрощает обзор

@stof хорошо, готово!

+1 Использование патча для хорошего эффекта.

+1 должно быть!

Как это работает? Я не могу заставить его работать. Я набираю «тед» из «Юнайтед», но в демоверсии нет результатов.

Что я делаю не так?

Спасибо

@saulob Попробуйте выбранную версию в моем репозитории, которую я перенес из этого и добавил другие исправления - несколько человек используют ее без проблем: https://github.com/eliasdorneles/chosen

@eliasdorneles ,

я искал это, это необходимо для оригинала.

спасибо @eliasdorneles, кажется, он отлично работает

+1 обязательно!

+1

+1 экономит кучу времени

+1 У меня была такая же потребность, и в итоге я сократил объем своего решения, чтобы не поддерживать сложный патч:

-      escapedSearchText = searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
+      escapedSearchText = searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&")
+         .split('\\ ').filter(function(e) { return e.length > 0 }).join('(.)+');

Это просто токенизирует поиск по пробелам, поэтому не позволяет изменить порядок. Было бы здорово, если бы поведение / решение, предложенное @YANOUSHek, было интегрировано в выбранное ядро!

: +1:

Была ли эта страница полезной?
0 / 5 - 0 рейтинги