Требования: полнотекстовый поиск на сайте — это распространённая функция, и она часто применяется на её основеElasticSearch、SolrВнедрение и разработка, а теперь выпущено два новыхRedisSearch、MeiliSearchПервые два варианта тяжелее, хотя последние два не такие тяжелые, как первые два, но всё равно требуют внедрения зависимых сервисов, в этой статье используется Lucene.Net + Jieba.NET для создания лёгкого поиска на сайте.
Lucene.Net
Lucene.Net — это .NET-порт Lucene и открытый набор для разработки полнотекстовой поисковой системы, то есть это не полноценный поисковый движок, а полнотекстовая архитектура поисковой системы, обеспечивающая полноценный движок запросов и индексирование.
Место:Вход по гиперссылке виден. Адрес на GitHub:Вход по гиперссылке виден.
Jieba.NET
Jieba.NET — это причастие китайского jieba. Версия .NET (реализация на C#). Он может выполнять такие функции, как сегментация слов, аннотация частей речи, извлечение ключевых слов и т.д. для китайского текста, а также поддерживает индивидуальные словари.
Адрес на GitHub:Вход по гиперссылке виден.
Сначала давайте рассмотрим рендеры:
Настройка анализатора
Analyzer, TokenStream, Tokenizer, TokenFilterTokenStream в Lucene TokenStream: поток, полученный после обработки токенайзера. Этот поток хранит различную информацию о сегментации слов, которую можно эффективно получить через TokenStream. Ниже приведен процесс преобразования файлового потока в TokenStream. Сначала используйте токенайзер для сегментации слов, разные токенизаторы имеют разные токенизаторы, после разделения токензира отфильтруйте данные, которые были разделены на слова, через TokenFilter, например, стоп-слова. После фильтрации объедините все данные в TokenStream.
Ссылка:
Вход по гиперссылке виден.
Вход по гиперссылке виден.
Вход по гиперссылке виден.
Для настройки анализатора Lucene на основе Jieba.NET первый источник выглядит следующим образом:
Обратитесь напрямую к пакету Lucene.Net.Analysis.Common, так как Lucene.Net.Analysis.Common полагается на автоматическую загрузку пакета Lucene.Net.
Создайте новый JiebaTokenizer.cs с помощью следующего кода:
Создайте новый JiebaAnalyzer.cs с следующим кодом:
Lucene.Net Создание новых документов и поиск
Добавляйте данные с сайта в Lucene регулярно или по триггеру, и Lucene хранит документ на физическом диске через анализатор, а затем вызывает поисковый интерфейс для поиска.
Код класса помощи LuceneHelper следующий:
Хранилище хранения
Store.YES: Он не только индексирует данные, но и сохраняет их, чтобы результаты поиска могли возвращать информацию о полях. Store.NO: Индексируются только данные, и данные не сохраняются, и результаты поиска не могут получить эту информацию по полям.Экономит место на диске;
Как показано ниже:
Тип поля
Типы полей в Lucene.Net: Int32Field, Int64Field, SingleField, DoubleField, BinaryDocValuesField, NumericDocValuesField, SortedDocValuesField, StringField, TextField, StoredField, Пожалуйста, используйте подходящий тип данных в соответствии с вашей ситуацией.
TextField против StringField
TextField определённо будет лексикализован, StringField не будет выполнять лексический анализ содержимого, хранящегося в doc, см. следующее:Вход по гиперссылке виден.
Поиск по составным встречам
Существует 6 комбинаций следующих вариантов:
1. ОБЯЗАТЕЛЬНО и ДОЛЖНО: Получить пересечение последовательных запросов. 2. MUST и MUST_NOT: Указывает, что результаты поиска по клаузе запроса, соответствующей MUST_NOT, не могут быть включены в результаты запроса. 3.SHOULD и MUST_NOT: При непрерывном использовании функция совпадает с MUST и MUST_NOT. 4. Когда SHOULD и MUST используются вместе, результатом является результат поиска по клаузе MUST, но SHOULD может влиять на сортировку. 5. ДОЛЖНО и ДОЛЖНО: Указывает на связь между «или», а конечный результат поиска — объединение всех поисковых клауз. 6.MUST_NOT и MUST_NOT: бессмысленно, извлечение без результатов.
Запустите проект
На этом этапе вы можете начать проект, добавляя, обновляя и искать интерфейсный код следующим образом:
Ошибки могут быть указаны следующим образом:
Во время обработки запроса возникло необработанное исключение.
DirectoryNotFoundException: Could not find a part of the path 'C:\Users\itsvse_nuc11\source\repos\DiscuzSearch\DiscuzSearch\bin\Debug\net6.0\Resources\prob_trans.json'. Microsoft.Win32.SafeHandles.SafeFileHandle.CreateFile (строка fullPath, режим FileMode, FileAccess Access, FileShare share, опции FileOptions)
TypeInitializationException: The type initializer for 'JiebaNet.Segmenter.JiebaSegmenter' threw an exception. jieba.net После установки вы можете увидеть каталог Resources в каталоге packages\jieba.NET, где содержатся словарь и другие файлы данных, необходимые для запуска jieba.NET, а самый простой способ настройки — скопировать весь каталог Resources в каталог, где находится ассемблер, чтобы jieba.NET использовались встроенные значения конфигурации по умолчанию.
C:\Users\%USERPROFILE%\.nuget\packages\jieba.net\0.42.2\Resources JiebaNet нужно добавить папку конфигурации, код которой выглядит следующим образом:
Тест создал 500 новых документов (связанных с моей реальной ситуацией, только для справки), а диск занимает 119 КБ, как показано на рисунке ниже:
(Конец)
|