Как Вы заставляете ведущий подстановочный знак полнотекстовые поиски работать в SQL Server?

public class LambdaExperiments {

  @FunctionalInterface
  public interface RFunction<T, R> extends Function<T, R> {
    R recursiveCall(Function<? super T, ? extends R> func, T in);

    default R apply(T in) {
      return recursiveCall(this, in);
    }
  }

  @FunctionalInterface
  public interface RConsumer<T> extends Consumer<T> {
    void recursiveCall(Consumer<? super T> func, T in);

    default void accept(T in) {
      recursiveCall(this, in);
    }
  }

  @FunctionalInterface
  public interface RBiConsumer<T, U> extends BiConsumer<T, U> {
    void recursiveCall(BiConsumer<T, U> func, T t, U u);

    default void accept(T t, U u) {
      recursiveCall(this, t, u);
    }
  }

  public static void main(String[] args) {
    RFunction<Integer, Integer> fibo = (f, x) -> x > 1 ? f.apply(x - 1) + f.apply(x - 2) : x;

    RConsumer<Integer> decreasingPrint = (f, x) -> {
      System.out.println(x);
      if (x > 0) f.accept(x - 1);
    };

    System.out.println("Fibonnaci(15):" + fibo.apply(15));

    decreasingPrint.accept(5);
  }
}

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

42
задан John Saunders 17 July 2009 в 11:26
поделиться

9 ответов

Обходное решение только для ведущего подстановочного знака:

  • хранят текст, инвертированный в различном поле (или в осуществленном представлении)
  • создают полнотекстовый индекс на этом столбце
  • , находят обратный текст с *

    SELECT * 
    FROM TABLENAME 
    WHERE CONTAINS(TextColumnREV, '"mrethcraes*"');
    

, Конечно, существует много недостатков, только для быстрого обходного решения...

Не говоря уже о CONTAINSTABLE...

25
ответ дан marc_s 26 November 2019 в 23:53
поделиться

Проблема с продвижением Подстановочных знаков: Они не могут быть индексированы, следовательно Вы делаете полное сканирование таблицы.

15
ответ дан Michael Stum 26 November 2019 в 23:53
поделиться

Возможно использовать подстановочный знак "*" в конце слова или фразы (поиск префикса).

, Например, этот запрос найдет весь "datab", "базу данных", "базы данных"...

SELECT * FROM SomeTable WHERE CONTAINS(ColumnName, '"datab*"')

, Но, unforutnately, не возможно искать с ведущим подстановочным знаком.

, Например, этот запрос не найдет "базу данных"

SELECT * FROM SomeTable WHERE CONTAINS(ColumnName, '"*abase"')
9
ответ дан 26 November 2019 в 23:53
поделиться

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

3
ответ дан Dave Ward 26 November 2019 в 23:53
поделиться

Подстановочный символ в SQL Server эти % знак, и это работает просто великолепно, продвижение, запаздывая или иначе.

Однако если бы Вы собираетесь быть выполнением какого-либо вида серьезного полнотекстового поиска тогда, я рассмотрел бы использование возможностей Полнотекстового индекса. Используя % и _ подстановочные знаки заставят Вашу базу данных получать серьезный удар производительности.

3
ответ дан Kev 26 November 2019 в 23:53
поделиться

От SQL Server Books Online:

Для записи полнотекстовых запросов в Microsoft SQL Server 2005 необходимо изучить, как использовать СОДЕРЖАНИЕ и предикаты Transact-SQL FREETEXT, и CONTAINSTABLE и функции со знаком набора строк FREETEXTTABLE.

, Который означает, все запросы, записанные выше с % и _, не являются допустимыми полнотекстовыми запросами.

Вот образец того, на что запрос похож при вызывании функции CONTAINSTABLE.

ИЗБРАННЫЙ РАЗРЯД, * ОТ TableName, CONTAINSTABLE (TableName, *, '"*WildCard"') searchTable, ГДЕ [КЛЮЧ] = ORDER BY TableName.pk searchTable. DESC

РАЗРЯДА Для CONTAINSTABLE функционирует, чтобы знать, что я использую подстановочный поиск, я должен обернуть его в двойные кавычки. Я могу использовать подстановочный символ * вначале или окончание. Существует много других вещей, которые можно сделать при создании строки поиска для функции CONTAINSTABLE. Можно искать слово около другого слова, искать флективные слова (диск = диски, управлял, управление, и управляемый), и поиск синонима другого слова (металл может иметь синонимы, такие как алюминий и сталь).

я просто составил таблицу, поместил полнотекстовый индекс на таблицу и сделал несколько тестовых поисков и не имел проблемы, таким образом, подстановочные работы поиска, как предназначено.

[Обновление]

я вижу, что Вы обновили свой вопрос и знаете, что необходимо использовать одну из функций.

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

Example:  "*ildcar" will look for a single word as long as it ends with "ildcar".

Example:  "*ildcar*" will look for a single word with "ildcar" in the middle, which means it will match "wildcard".  [Just noticed that Markdown removed the wildcard characters from the beginning and ending of my quoted string here.]

[Обновление № 2]

Dave Ward - Используя подстановочный знак с одной из функций не должен быть огромным хитом перфекта. Если я создал строку поиска только с "*", она не возвратит все строки в моем тестовом сценарии, она возвратила 0 записей.

1
ответ дан Otto 26 November 2019 в 23:53
поделиться

Просто к вашему сведению Google не делает никаких поисков подстроки или усечения, права или оставленный. У них есть подстановочный символ * для нахождения незнакомых слов во фразе, но не слова.

Google, наряду с большинством механизмов полнотекстового поиска, настраивает инвертированный индекс на основе алфавитного порядка слов со ссылками на их исходные документы. Двоичный поиск злой быстрый, даже для огромных индексов. Но действительно действительно трудно сделать лево-усечение в этом случае, потому что это теряет преимущество индекса.

1
ответ дан user9569 26 November 2019 в 23:53
поделиться

Когда дело доходит до полнотекстового поиска за мои деньги ничто не бьется Lucene. Существует .Net порт, доступный , который совместим с индексами, созданными с версией Java.

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

Как пример, эта функциональность поиска приводится в действие Lucene. Сеть.

0
ответ дан Sean Carpenter 26 November 2019 в 23:53
поделиться

% Соответствует любому количеству символов _ Соответствия отдельный символ

, я никогда не использовал Полнотекстовое индексирование, но можно выполнить довольно сложные и быстрые поисковые запросы с простым использованием сборки в строковых функциях T-SQL.

-1
ответ дан GateKiller 26 November 2019 в 23:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: