Я хотел бы сделать расширенный поиск с JavaScript. Как?

Я имею основное, чувствительное к регистру, называю определенный поиск с кодом ниже. Это будет работать на данный момент, но я хотел бы что-то что (В порядке важности):

1: игнорирует случай (т.е. "привет" и "Привет" оба то же самое. toLowerCase не является выбором и не является тем же самым),

2: Приведет к хиту, если поисковым запросом будет 'Критерий поиска', и обысканная последовательность 'ищет слова' как пример.

3: Ищет всю последовательность даже после нахождения хита для большего количества хитов.

The purpose is to search a

tag with a specific id for a term. If it has it then display it. Ultimately, I will use this in a loop that will search many

tags and display the ones with hits and leave hidden the ones without.

КОДЕКС:

<!DOCTYPE HTML>
<html>
    <body>
        
Click the button to locate where in the string a specifed value occurs.

Hello world, welcome to the universe.

<button onclick="myFunction()">Try it</button> <script> function myFunction() { var x = document.getElementById("demo1") var str = x.innerHTML.toString(); var n = str.indexOf("welcome"); if (n != -1) { x.style.display = 'inline'; } else { x.innerHTML = 'Negative'; x.style.display = 'inline'; } } </script> </body> </html>
2
добавлено отредактировано
Просмотры: 1
de
"toLowerCase не выбор и не является тем же самым" почему нет?
добавлено автор PeeHaa, источник
@fredsbend, из которых Это действительно сортирует, нормализуют текст. И красота его имеет вас, делают это и на ключевом слове (словах) и на предмете поиска, это делает поиск без учета регистра:)
добавлено автор PeeHaa, источник
Этот isn' t задача для JavaScript. Сделать что you' d как, необходимо будет использовать обработку естественного языка. I' d начинаются с размечания вашей входной строки и удаления суффиксов. Оттуда, можно попытаться искать базу данных.
добавлено автор Blender, источник
Этот вид материала обычно isn' t сделанная клиентская сторона. У Явы есть связка хороших библиотек обработки естественного языка, которыми вы могли пользоваться, но у них действительно есть крутая кривая обучения.
добавлено автор Blender, источник
Я знаю некоторую Яву. Апплет был бы в состоянии обращаться с этим?
добавлено автор fredsbend, источник
toLowerCase изменяет срок поиска, который бесполезен, так как случай обысканной последовательности неизвестен. toLowerCase должен нормализовать текст.
добавлено автор fredsbend, источник
@Blender делают у вас есть связь для этих библиотек и как использовать их.
добавлено автор fredsbend, источник
@PeeHaa и Спасибо Ричарда Марра. Я предполагаю, что у меня был заскок. Didn' t думают, чтобы использовать toLowerCase на обоих. Это действительно решает чувствительную к регистру проблему.
добавлено автор fredsbend, источник
@fredsbend you' d должен использовать toLowerCase на обоих исходных данных, индексируемом тексте и тексте запроса. Пожалуйста, примите во внимание, что это - трудная проблема, и каждая проблема вы решаете или работаете вокруг, будет заменен другим до вашей утечки абстракций, и вы кричите как ребенок. Если вы знаете Яву, взглянули на кодовую базу Lucene для вдохновения (there' s книга также).
добавлено автор Richard Marr, источник

3 ответы

Я начал бы, разметив вашу входную строку:

function tokenize(input) {
    return input.toLowerCase().replace(/[^a-z0-9_\s]/g, '').split(/\s+/g)
}

Который делает это к вашим критериям поиска:

> tokenize("I'm your search string.")
["im", "your", "search", "string"]

Затем, раздевают от суффиксов (я даже не собираюсь пытаться обращаться со случаями, где это не будет работать. Это - то, что NLP для):

function remove_suffix(token) {
    return token.replace(/(ing|s)$/, '');
}

Это сделает это к каждому символу:

> remove_suffix('searching')
"search"
> remove_suffix('terms')
"term"

Таким образом для каждой строки запроса, можно построить список ключевых слов:

function get_keywords(query) {
    var tokens = tokenize(query);
    var keywords = tokens.map(remove_suffix);
    keywords.sort();

    return keywords;
}

И это преобразует ваш вопрос в ключевые слова:

> get_keywords('searching terms')
["search", "term"]
> get_keywords('term search')
["search", "term"]

Теперь, вы просто проверяете, чтобы видеть, содержатся ли ключевые слова вашей строки запроса в ключевых словах вашей строки поиска.

Это - действительно простой пример и не будет обращаться со множеством угловых случаев, но по крайней мере вы видите несколько, как можно использовать ключевые слова для поиска.

3
добавлено
@Cerbrus: И ' running'-> ' runn' . Список исключений просто продолжается и на.
добавлено автор Blender, источник
Только, чтобы дать пример того, что может пойти не так, как надо: remove_suffix (' string') -> "str" . Однако, +1, с тех пор it' s хороший ответ для остальных.
добавлено автор Cerbrus, источник

Это, с некоторыми щипание, должно выполнить ваши требования, которым я верю. Могло бы быть лучше сделать это в бэкенде хотя =).

// returns the indices of the found searchStr within str, case sensitive if needed
function getIndicesOf(searchStr, str, caseSensitive) {
    var startIndex = 0, searchStrLen = searchStr.length;
    var index, indices = [];
    if (!caseSensitive) {
        str = str.toLowerCase();
        searchStr = searchStr.toLowerCase();
    }
    while ((index = str.indexOf(searchStr, startIndex)) > -1) {
        indices.push(index);
        startIndex = index + searchStrLen;
    }
    return indices;
}

// this splits the search string in an array of search strings
var myStringArray = mySearchString.split("\\s+");
var result = true;
// loop over all the split search strings, and search each seperately
for (var i = 0; i < myStringArray.length; i++) {
    var indices = getIndicesOf(myStringArray[i], "I learned to play the Ukulele in Lebanon.", false);
    if(indices && indices.length>0){
       //do something with the indices of the found string
    } else {
        result = false;
    }
}
// result will be false here if one of the search terms was not found.

borrowed from here

2
добавлено
Мало того, что мне нужна эта серверная сторона также на диске. Я брошу более близкий взгляд на это. Спасибо
добавлено автор fredsbend, источник

Смотрите на двигателе Регулярных выражений. Это занимает время, чтобы выучить лишь, как только вы знаете это, вы, вероятно, достигнете своей цели здесь.

Here is a: link

Надежда это помогает

0
добавлено
До сих пор я вижу, как получить нечувствительность к регистру. Я буду, конечно, использовать это. Вид видит, как я мог бы решить пункт 2 на оригинальной почте. Don' t вполне видят, как решить пункт 3 на оригинальной почте.
добавлено автор fredsbend, источник
Короче говоря - можно использовать группы, и глобальный поиск (пометьте/g). Для большего количества ответа можно прочитать это: JavaScript similar to phps">stackoverflow.com/questions/520611/…
добавлено автор Mark Bramnik, источник