Как найти неполное слово

Following a question posted here about how I can increase the speed on one of my SQL Search methods, I was advised to update my table to make use of Full Text Search. This is what I have now done, using Gist indexes to make searching faster. On some of the “plain” queries I have noticed a marked increase which I am very happy about.

However, I am having difficulty in searching for partial words. For example I have several records that contain the word Squire (454) and I have several records that contain Squirrel (173). Now if I search for Squire it only returns the 454 records but I also want it to return the Squirrel records as well.

My query looks like this

SELECT title 
FROM movies 
WHERE vectors @@ to_tsoquery('squire');

I thought I could do to_tsquery('squire%') but that does not work.
How do I get it to search for partial matches ?

Also, in my database I have records that are movies and others that are just TV Shows. These are differentiated by the “” over the name, so like “Munsters” is a TV Show, whereas The Munsters is the film of the show. What I want to be able to do is search for just the TV Show AND just the movies. Any idea on how I can achieve this ?

Regards
Anthoni

a_horse_with_no_name's user avatar

asked Mar 25, 2010 at 6:32

Anthoni Gardner's user avatar

Anthoni GardnerAnthoni Gardner

9291 gold badge9 silver badges17 bronze badges

1

Try,

SELECT title FROM movies WHERE to_tsvector(title) @@ to_tsquery('squire:*')

This works on PostgreSQL 8.4+

answered Aug 9, 2010 at 19:32

Alexander Mera's user avatar

7

Anthoni,

Assuming you plan on using only ASCII encoding (could be difficult, I’m aware), a very viable option may be the Trigram (pg_trgm) module: http://www.postgresql.org/docs/9.0/interactive/pgtrgm.html

Trigram utilizes built-in indexing methods such as Gist and Gin. The only modification you have to make is when defining your index, specify an Operator Class of either gist_trgm_ops or gin_trgm_ops.

If the contrib modules aren’t already installed, in Ubuntu it’s as easy and running the following command from the shell:

# sudo apt-get install postgresql-contrib

After the contrib modules are made available, you must install the pg_trgm extension into the database in question. You do this by executing the following PostgreSQL query on the database you wish to install the module into:

CREATE EXTENSION pg_trgm;

After the pg_trgm extension has been installed, we’re ready to have some fun!

-- Create a test table.
CREATE TABLE test (my_column text)
-- Create a Trigram index.
CREATE INDEX test_my_colun_trgm_idx ON test USING gist (my_column gist_trgm_ops);
-- Add a couple records
INSERT INTO test (my_Column) VALUES ('First Entry'), ('Second Entry'), ('Third Entry')
-- Query using our new index --
SELECT my_column, similarity(my_column, 'Frist Entry') AS similarity FROM test WHERE my_column % 'Frist Entry' ORDER BY similarity DESC

answered Feb 16, 2012 at 22:20

Joshua Burns's user avatar

Joshua BurnsJoshua Burns

8,2104 gold badges48 silver badges60 bronze badges

2

@alexander-mera solution works great!

Note: Also make sure to convert spaces to +. For example, if you are searching for squire knight.

SELECT title FROM movies WHERE to_tsvector(title) @@ to_tsquery('squire+knight:*')

Joshua Burns's user avatar

Joshua Burns

8,2104 gold badges48 silver badges60 bronze badges

answered Nov 20, 2012 at 20:48

Greg's user avatar

GregGreg

4,4892 gold badges29 silver badges22 bronze badges

4

Even using LIKE you will not be able to get ‘squirrel’ from squire% because ‘squirrel’ has two ‘r’s. To get Squire and Squirrel you could run the following query:

SELECT title FROM movies WHERE vectors @@ to_tsquery('squire|squirrel');

To differentiate between movies and tv shows you should add a column to your database. However, there are many ways to skin this cat. You could use a sub-query to force postgres to first find the movies matching ‘squire’ and ‘squirrel’ and then search that subset to find titles that begin with a ‘”‘. It is possible to create indexes for use in LIKE '"%...' searches.

Without exploring other indexing possibilities you could also run these – mess around with them to find which is fastest:

SELECT title 
FROM (
   SELECT * 
   FROM movies 
   WHERE vectors @@ to_tsquery('squire|squirrel')
) t
WHERE title ILIKE '"%';

or

SELECT title 
FROM movies 
WHERE vectors @@ to_tsquery('squire|squirrel') 
  AND title ILIKE '"%';

a_horse_with_no_name's user avatar

answered Mar 25, 2010 at 13:43

thetaiko's user avatar

thetaikothetaiko

7,7962 gold badges33 silver badges49 bronze badges

The broad solution to this is to use PG’s ts_rewrite function to setup an aliases table that works for alternate matches (see Query Rewriting). This covers cases like yours above while also handling completely different cases like searching for tree rat and getting results for squirrel, etc.

Full details and explanation at that link, but the gist of it is that you can setup an aliases table with 2 ts_query columns and pass a query of that table to in with your search, like so:

CREATE TABLE aliases (t tsquery primary key, s tsquery);
INSERT INTO aliases VALUES(to_tsquery('supernovae'), to_tsquery('supernovae|sn'));

SELECT ts_rewrite(to_tsquery('supernovae & crab'), 'SELECT * FROM aliases');

Resulting in a final query that looks more like:

WHERE vectors @@ ts_rewrite(to_tsquery('supernovae & crab'), 'SELECT * FROM aliases')

This is similar to the thesaurus setup within PG but works without requiring a full reindex every time you add something. As you come across little spelling variations and cases of “when I search for this I expect results like this” it’s very easy to just add them to the table real quick. You can add more columns to that table as well as long as the query based to ts_rewrite returns the 2 expected to_tsquery columns.

When you dig into that documentation you’ll see suggested examples for performance tuning as well. There’s a balance between using trigram for pure speed and using vector/query/rewrite for robustness.

answered Jul 5, 2016 at 16:17

brightball's user avatar

brightballbrightball

91513 silver badges10 bronze badges

One thing that may work is break the word you are searching for into smaller parts. So you could look for things that have squi or quir or squire or etc… I’m not sure how efficient that would be though, but it may help.

When you search for the film or movie you could try placing the text in the single quote. so it would be either ‘show’ or ‘”show”‘. I think that could also work.

answered Mar 25, 2010 at 14:17

John Kane's user avatar

John KaneJohn Kane

4,3631 gold badge24 silver badges42 bronze badges

На чтение 4 мин. Просмотров 83 Опубликовано 25.05.2021

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

Искать частичное слово или строку в Outlook

Вкладка Office – включение редактирования и просмотра с вкладками в Office и упрощение работы …

Подробнее … Скачать …

Kutools for Outlook – приносит 100 мощных расширенных функций в Microsoft Outlook

  • Автоматическая копия/скрытая копия по правилам при отправке электронной почты; Автоматическая пересылка нескольких писем по правилам; Автоматический ответ без сервера обмена и другие автоматические функции …
  • Предупреждение о скрытой копии – показывать сообщение при попытке ответить всем, если ваш почтовый адрес находится в списке скрытой копии; Напоминать при отсутствии вложений и другие функции напоминания …
  • Ответить (всем) со всеми вложениями в почтовой беседе; Отвечайте сразу на несколько писем; Автоматическое добавление приветствия при ответе; Автоматическое добавление даты и времени в тему …
  • Инструменты для вложений: автоматическое отключение, сжатие всех, переименование всех, автоматическое сохранение всех … Быстрый отчет, подсчет выбранных писем, удаление повторяющихся писем и контактов …
  • Более 100 дополнительных функций решат большинство ваших проблем в Outlook 2010-2019 и 365. Полнофункциональная 60-дневная бесплатная пробная версия.

Подробнее Загрузить

->


Искать частичное слово или строку в Outlook

Например, в электронном письме есть предложение «новый порядок xx54235», но вы просто помните частичное слово 235, то вы хотите найти электронное письмо с этим частичным словом 235. Пожалуйста, сделайте следующее.

1. В Outlook 2010 и 2013 откройте диалоговое окно Расширенный поиск , щелкнув поле Мгновенный поиск , а затем нажмите Инструменты поиска > Расширенный поиск на вкладке Поиск . См. Снимок экрана:

В Outlook 2007 нажмите Инструменты > Мгновенный поиск > Расширенный поиск , чтобы открыть диалоговое окно Расширенный поиск .

Кроме того, вы можете просто нажимать сочетания клавиш Ctrl + Shift + F , чтобы открыть диалоговое окно Расширенный поиск .

2. В диалоговом окне Расширенный поиск перейдите на вкладку Дополнительно , затем выполните следующие операции:

1). Если в тело письма включены частичные слова, нажмите Поле > Все поля почты > Сообщение ;

Если в тему письма включены частичные слова, нажмите Поле > Все поля почты > Тема . См. Снимок экрана:

2). Затем выберите содержит в раскрывающемся списке Условия ;

3). Введите часть слова в поле Значение .

4) Нажмите кнопку Добавить в список .

5). Затем выберите условие, которое вы только что добавили, в поле Найти элементы, соответствующие этим критериям , а затем нажмите кнопку Найти сейчас .

Таким образом, электронные письма, содержащие неполное слово, будут перечислены в Диалоговое окно “Расширенный поиск” . Вы можете дважды щелкнуть, чтобы открыть его.

Примечание : вы можете нажать кнопку «Обзор», чтобы выбрать папку, в которой вы хотите искать.

->


Рекомендуемые инструменты повышения производительности для Outlook ->

Kutools for Outlook – добавляет 100 расширенных функций в Outlook и делает работу намного проще!

  • Авто CC/BCC от правила при отправке электронной почты; Автоматическая пересылка нескольких писем по индивидуальному заказу; Автоматический ответ без сервера обмена и другие автоматические функции …
  • Предупреждение о скрытой копии – показывать сообщение при попытке ответить всем, если ваш почтовый адрес находится в списке скрытой копии; Напоминать при отсутствии вложений и другие функции напоминания …
  • Ответить (всем) со всеми вложениями в почтовой беседе; Ответить на множество писем за секунды; Автоматическое добавление приветствия при ответе; Добавить дату в тему …
  • Инструменты вложений: управление всеми вложениями во всех сообщениях, автоматическое отключение, сжатие всех, переименование всех, сохранение всех … Быстрый отчет, подсчет выбранных сообщений …
  • Мощные нежелательные сообщения электронной почты по индивидуальному заказу; Удаление повторяющихся писем и контактов … Позволяет работать в Outlook умнее, быстрее и лучше.


Подробнее … Загрузить сейчас … Покупка ->


Неполное слово – Partial word

В Информатика и изучение комбинаторика слов, а частичное слово это нить который может содержать ряд символов «не знаю» или «не волнует», то есть заполнители в строке, где значение символа неизвестно или не указано. Более формально частичное слово – это частичная функция { displaystyle u:  {0,  ldots, n-1 }  rightarrow A} куда А – некоторый конечный алфавит. Если ты(k) не определено для некоторых { Displaystyle к  ин  {0,  ldots, п-1 }} затем неизвестный элемент на месте k в струне называется «дырой». В обычные выражения (после POSIX стандарт) дыра представлена метасимвол “.”. Например, aab.ab.b является частичным словом длины 8 по алфавиту А ={а,б}, в котором четвертый и седьмой символы являются дырами.[1]

Алгоритмы

Было разработано несколько алгоритмов для задачи «сопоставление строк с безразличием», в которой входными данными являются длинный текст и более короткое частичное слово, а цель состоит в том, чтобы найти все строки в тексте, которые соответствуют заданному частичному слову.[2][3][4]

Приложения

График совместимости частичных слов

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

Грани (подкубы) п-размерный гиперкуб можно описать частичными словами длины п над двоичным алфавитом, эти символы являются Декартовы координаты вершин гиперкуба (например, 0 или 1 для единичный куб ). Размер вложенного куба в этом представлении равен количеству содержащихся в нем символов безразличия. Такое же представление может также использоваться для описания импликанты из Логические функции.[6]

Частичные слова могут быть обобщены на слова параметров, в котором некоторые символы «не знаю» помечены как равные друг другу. Частичное слово – это частный случай параметрического слова, в котором каждый неизвестный символ может быть заменен символом независимо от всех остальных.[7]

Рекомендации

  1. ^ Бланше-Садри, Франсин (2008), Алгоритмическая комбинаторика частичных слов, Дискретная математика и ее приложения, Бока-Ратон, Флорида: Chapman & Hall / CRC, ISBN  978-1-4200-6092-8, МИСТЕР  2384993
  2. ^ Пинтер, Рон Ю. (1985), «Эффективное сопоставление строк с шаблонами, не требующими внимания», Комбинаторные алгоритмы на словах (Маратея, 1984), НАТО Adv. Sci. Inst. Сер. F Comput. Системные науки, 12, Springer, Berlin, стр. 11–29, МИСТЕР  0815329
  3. ^ Манбер, Уди; Баеза-Йейтс, Рикардо (1991), «Алгоритм сопоставления строк с последовательностью безразличий», Письма об обработке информации, 37 (3): 133–136, Дои:10.1016 / 0020-0190 (91) 90032-Д, МИСТЕР  1095695
  4. ^ Калаи, Адам (2002), «Эффективное сопоставление с образцом без забот», в Эппштейн, Дэвид (ред.), Материалы тринадцатого ежегодного симпозиума ACM-SIAM по дискретным алгоритмам, 6-8 января 2002 г., Сан-Франциско, Калифорния, США, ACM и SIAM, стр. 655–656.
  5. ^ Файги, У.; Гольдвассер, С.; Ловас, Л.; Safra, S; Сегеди, М. (1991), «Приближающая клика почти NP-полная», Proc. 32-й симпозиум IEEE. по основам информатики, стр. 2–12, Дои:10.1109 / SFCS.1991.185341, ISBN  0-8186-2445-0
  6. ^ Карно, Морис (1953), «Метод отображения для синтеза комбинационных логических схем», Труды Американского института инженеров-электриков, часть I: Связь и электроника, 1953: 593–599, Дои:10.1109 / TCE.1953.6371932, МИСТЕР  0069032
  7. ^ Prömel, Hans Jürgen (2002), “Большие числа, обозначение стрелок Кнута и теория Рамсея”, Синтез, 133 (1–2): 87–105, Дои:10.1023 / А: 1020879709125, JSTOR  20117296, МИСТЕР  1950045

Manticore

Loading

В информатике и изучении комбинаторики на словах , частичное слово является строка , которая может содержать некоторое количество «не знаю» или «не все равно» символы , т.е. заполнителей в строке , где значение символа не известно или не указан . Более формально, частичное слово – это частичная функция, где – некоторый конечный алфавит. Если u ( k ) для некоторых не определено, то неизвестный элемент в позиции k в строке называется «дырой». В регулярных выражениях (соответствующих стандарту POSIX ) дыра представлена метасимволом «.». Например, aab.ab.b – это частичное слово длиной 8 над алфавитом A = { a , b }, в котором четвертый и седьмой символы являются дырами.
{ displaystyle u:  {0,  ldots, n-1 }  rightarrow A}А{ Displaystyle к  ин  {0,  ldots, п-1 }}

Алгоритмы

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

Приложения

График совместимости частичных слов

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

Грани (подкубы) -мерного гиперкуба можно описать частичными словами длины в двоичном алфавите, символы которых являются декартовыми координатами вершин гиперкуба (например, 0 или 1 для единичного куба ). В этом представлении размер вложенного куба равен количеству содержащихся в нем символов безразличия. То же представление может также использоваться для описания импликантов из функций булевых .
пп

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

Ссылки

Добавить комментарий