Как реализовать хорошую поисковую систему для набора html страниц, созданных с помощью Mkdocs? - PullRequest
0 голосов
/ 21 января 2020

Я использую Mkdocs для создания статей (наборы страниц c HTML страниц). Проблема с этими документами состоит в том, что поисковая система, созданная Mkdocs, очень проста c, получая статьи довольно случайным образом, основываясь на их простом присутствии в тексте статьи, и никакое согласованное сопоставление фраз никоим образом не возможно, нет "AB C "Строгий поиск совпадений тоже.

Некоторые примеры того, как плохо работает поиск в настоящее время:
Когда вы вводите «не выбирать автозаполнение», поиск не вызовет 3 статьи, которые на самом деле содержат фразу «Не выбирать» Автозаполнение "по умолчанию", но вместо этого вызвать все статьи, содержащие, не, выберите, авто, заполнение + их варианты.

Когда вы вводите короткое слово, например, "пока" в поле поиска, результаты не извлекаются, хотя слово while присутствует в десятке статей. Другой пример: когда вы вводите «окно выбора», ни одна статья, содержащая фразу «окно выбора времени», не выводится в начало результатов поиска; вместо этого извлекаются все статьи, содержащие слово «окно».

Может ли кто-нибудь, разбирающийся в Mkdocs, посоветовать с этим, пожалуйста?

Что в моем Mkdocs.yml:

markdown_extensions:  
    - smarty  
    - toc:  
        permalink: True  
        separator: "_"  
    - sane_lists  
    - tables  
    - meta  
    - fenced_code  
    - admonition  
    - footnotes  
plugins:  
    - search  
extra:  
    version: 1.0  
    search:  
      tokenizer: '[\\s\\-\\.]+'  

{{{^ этот поисковый токенизатор по какой-то причине абсолютно игнорируется. Если он удален, поиск работает так же плохо :)}}}

Чего мне не хватает?

1 Ответ

1 голос
/ 21 января 2020

Прежде всего, поскольку в вашем файле mkdocs.yml не указана тема, предполагается, что вы используете тему по умолчанию, которая использует реализацию поиска по умолчанию. Обратите внимание, что некоторые другие темы (особенно material) реализуют свое собственное решение для поиска, которое отличается от заданного по умолчанию. Этот ответ не относится к этим темам.

Параметр поискового токенайзера игнорируется, поскольку вы определяете его неправильно. Как задокументировано , параметр называется separator, а не tokenizer, и его необходимо определить как подраздел подраздела search. Например:

plugins:
    - search:
        separator: '[\s\-\.]+'

Что касается поисковых терминов, обратите внимание, что MkDocs использует [lunr.js] в качестве поисковой системы. Lunr. js документы как конечный пользователь может изменять поиск различными способами.

Кстати, ваш поиск auto-filling не будет совпадать, как вы ожидаете, потому что дефис ( -) является символом-разделителем. Другими словами, когда создается индекс поиска, дефис обрабатывается так же, как пробел, а слова auto и filling индексируются как два отдельных слова. Если вы не хотите такого поведения, вам нужно удалить дефис из настроек. Но это, вероятно, не то, что вы хотите.

По умолчанию используется поиск ИЛИ. Если какой-либо из терминов (каждый из которых разделен каким-либо одним из символов-разделителей) существует в документе, то этот документ возвращается в качестве результата поиска. Если в документе существует несколько терминов, этот документ имеет более высокий рейтинг. Однако поиск ИЛИ не учитывает термины, относящиеся друг к другу в документе.

Вы можете найти поиск И более эффективным. Просто добавьте + к каждому термину (+do +not +select +auto +filling), и тогда вы получите только те результаты, которые содержат все термины. Обратите внимание, что я также оставил дефис вне поисковых терминов, так как он является разделителем, как описано выше.

Однако, хотя он будет возвращать только результаты, содержащие все термины, он не поддерживает результаты, содержащие термины, сгруппированные в указанном порядке c. Распространенным решением, которое используют поисковые системы, является требование, чтобы термины, заключенные в кавычки, соответствовали указанному порядку c. Однако согласно livernn / lunr.js # 62 , lunr. js не поддерживает эту функцию в настоящее время.

Кроме того, поисковая система игнорирует стоп-слова. В частности, некоторые слова настолько распространены, что они полностью игнорируются поисковой системой. Например, такие слова, как the или a, встречаются несколько раз в каждом документе на английском языке Engli sh. Таким образом, поисковая система игнорирует их.

Тогда возникает проблема stemming , которая объясняется в документации по lunr. js:

Stemming это процесс приведения слов с перегибом или производных к их основному или основному виду. Например, в основаниях «поиск», «поиск» и «поиск» должны быть слова «поиск». Это имеет два преимущества: во-первых, число токенов в поисковом индексе и, следовательно, его размер значительно уменьшаются, и, кроме того, это увеличивает отзыв при выполнении поиска. Документ, содержащий слово «поиск», вероятно, будет иметь отношение к запросу «поиск».

Учитывая вышеизложенное, вы, вероятно, обнаружите, что поиск select auto fill, скорее всего, вернет точно такие же результаты, как do not select auto-filling. Однако использование +filling должно помочь, так как оно вызывает точное совпадение для термина filling, а не слова fill.

Наконец, вы спрашиваете ...

Как реализовать хорошую поисковую систему

Обратите внимание, что такой вопрос слишком широк и не входит в число вопросов c здесь. Тем не менее, в документации по lunr. js, на которую есть ссылки выше, приводится краткое изложение многих базовых c концепций, используемых большинством поисковых систем. Хотя вы, вероятно, сделаете несколько разных вариантов в своей реализации (как и я), базовые концепции c должны дать вам отправную точку для поиска терминов в вашем исследовании, если вы действительно заинтересованы в создании собственной поисковой системы целиком. .

...