Как построить бесплатный поиск по таблицам базы данных sql-сервера? - PullRequest
0 голосов
/ 10 мая 2018

Я создаю веб-приложение, аналогичное quora / stackoverflow, которое позволяет пользователям выполнять операции CRUD над банком вопросов (банк вопросов очень маленький, ~ 500 вопросов с максимум 5 ответами на вопрос) наряду с поиском.Как создать функцию поиска в свободном потоке или автоматического предложения в банке вопросов?

Технический стек:

  1. Restful-сервисы для операций CRUD предоставляются с сервера на основе Java EE (пружинная загрузка)размещено на tomcat.
  2. Приложение внешнего интерфейса создано с использованием React и обслуживается с сервера Node.
  3. Используется база данных SQL Server.

Схема банка вопросов:

questionId: String

tags: [String]

title: String

description: String

answernotes: [String]

applicableJobRole: [Intern, Full Time]

state: [Approved, UnderReview, Obsolete]

difficultyLevel: [Easy, Medium, Hard]

noOfTimesUsed: int

createdBy: user

Требование:

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

Напримерчто-то похожее на изображение ниже (взято из Quora).

Вопросы:

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

Существуют ли другие способы быстрого использования рекомендуемых решений для создания функции поиска в свободном потоке длятакой вариант использования?

Здесь приветствуются ссылки / указатели.

Search from Quora

Ответы [ 4 ]

0 голосов
/ 16 мая 2018

микпальмия верна.Для создания небольшого указателя вопросов меньше не нужно было бы использовать Elastic Search или Solr.Вам следует использовать lucene-core и lucene.

Если вы используете maven в своем java-проекте, вы можете включить следующую зависимость в свой pom.xml.

<!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-core -->
<dependency>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-core</artifactId>
    <version>7.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-queryparser -->
<dependency>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-queryparser</artifactId>
    <version>7.3.1</version>
</dependency>

Как только вы получите этибиблиотеки, вы можете индексировать свои вопросы как документы, следуя этому коду .Где ваш документ может быть простым объектом, содержащим Идентификатор вопроса, Название и Описание.

private org.apache.lucene.document.Document createDocument
    (String id, String title, String description){
    Document document = new Document();
    document.add(new StringField("id", id, Field.Store.YES));
    document.add(new StringField("title", title, Field.Store.YES));
    document.add(new StringField("description", description, Field.Store.YES));
    return document;
}

При поиске дублирующего вопроса вы будете следовать этот код

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;

private static TopDocs searchByTitle(String title, IndexSearcher searcher) 
throws Exception {
    QueryParser qp = new QueryParser("title", new StandardAnalyzer());
    qp.setAllowLeadingWildcard(true);
    Query titleQuery = qp.parse(title);
    TopDocs hits = searcher.search(firstNameQuery, 10);
    return hits;
}

гдеВы также можете указать функции searchByTitle выполнить поиск по описанию

TopDocs docs = searchByTitle(" ( title:" + enteredText + "~ OR title:*" + enteredText + 
    "* ) OR  ( description:" + enteredText + " )", searcher)
0 голосов
/ 14 мая 2018

Подходит ли эластичный поиск для индексации или создания функции поиска для такого небольшого набора данных?

Да, это так.Я думаю, что размер ваших данных, которые вы хотите проиндексировать, не является главной проблемой здесь.Библиотека или поисковая система, такая какasticsearch, solr или lucene, имеют некоторые базовые функциональные возможности, которые вы действительно используете, если хотите реализовать удобный и современный поиск.Только некоторые варианты использования вы действительно испытываете затруднения, если вы не используете один из них:

  • Анализ на основе языка (stemming)
  • улучшенная поддержка многоязычных вариантов использования
  • Полнотекстовый поиск
  • Автоматическое предложение с расстоянием Левенштейна

Стоит ли создавать индексы с использованием собственной структуры данных, такой как дерево суффиксов, на самом сервере приложений?

На основании ответа от микпалмии: он прав.не делай этого!используйте поисковую систему / библиотеку для этого.Они предназначены для вас, и они делают это очень хорошо.

0 голосов
/ 16 мая 2018

ElasticSearch и Solr - отличные серверы полнотекстового поиска, а Lucene - отличная библиотека полнотекстового поиска, которую вы можете использовать в своем сценарии. Но знаете ли вы, что SQL Server имеет возможности полнотекстового поиска? используя CONTAINS , вы можете искать:

  • Слово или фраза.
  • Префикс слова или фразы.
  • Слово рядом с другим словом.
  • Слово, порождённое из другого слова (например, слово диск - это флективная ножка дисков, водила, водила и привод).
  • Слово, которое является синонимом другого слова, использующего тезаурус (для Например, слово «металл» может иметь синонимы, такие как «алюминий» и "Сталь").

Чтобы использовать CONTAINS, вам необходимо настроить полнотекстовый поиск

Полнотекстовый поиск в SQL Server не такой сложный и быстрый, как ElasticSearch или Lucene, но:

  • Это часть SQL Server, поэтому вам не нужна другая движущаяся часть.
  • Индексы автоматически обновляются. С ElasticSearch или Lunece вам нужно использовать какой-то механизм для обновления индексов при изменении базовых таблиц.
  • Я думаю, этого достаточно для вашего сценария.
0 голосов
/ 11 мая 2018

Должен ли я создавать индексы, используя самостоятельно созданную структуру данных, такую ​​как суффиксное дерево, на самом сервере приложений?

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...