Индекс PHP слова, производительность и разумные результаты - PullRequest
3 голосов
/ 23 июля 2010

В настоящее время я работаю над индексатором для функции поиска. Индексатор будет работать над данными из «полей». Поля выглядит так:

  Field_id   Field_type   Field_name   Field_Data
- 101        text         Name         Intel i7
- 102        integer      Cores        4 physical, 4 virtual
- 103        select       Vendor       Intel
- 104        multitext    Description  The i7 is intel's next gen range of cpus.

Индексатор будет генерировать следующие результаты / индекс:

  Keyword    Occurrences
- intel      101, 103, 104
- i7         101, 104
- physical   102
- virtual    102
- next       104
- gen        104
- range      104
- cpus       104   (*)
- cpu        104   (*)

Так что все выглядит неплохо, но есть некоторые проблемы, которые я бы хотел решить:

  • отфильтровывая общие слова (как вы, возможно, заметили, "список" "," слова "и" intel "отсутствуют в списке)
  • Что касается "процессора" (множественное число против единственного числа), то лучше ли использовать конкретный тип (единственное или множественное число), оба или точные (т. Е. "Процессор" отличается от "процессора")?
  • Продолжая предыдущий пункт, как определить множественное число (различные вкусы: test => tests fish => fish and leaf => leaves)
  • В настоящее время я использую MySql и очень обеспокоен проблемами с производительностью; у нас есть более 500 категорий, и мы даже не запустили сайт
  • Допустим, я хотел использовать поисковый термин "vendor: intel", где vendor указывает имя поля (field_name), как вы думаете, это окажет огромное влияние на сервер sql?
  • Дросселирование поиска; Мне это совсем не нравится, но это возможно, и если вы знаете какие-либо обходные пути, выслушайте их!
  • Были и другие проблемы, о которых я, вероятно, забыл, если вы их обнаружите, вы можете кричать на меня; -)
  • Мне не нужна поисковая система для сканирования ссылок, на самом деле, я специально хочу, чтобы она не сканировала ссылки .

(кстати, я не пристрастен к Intel, просто бывает, что у меня есть компьютер на базе i7 ;-))

Ответы [ 7 ]

3 голосов
/ 23 июля 2010

Получите отсюда список стоп-слов (не ключевых слов), парень даже отформатировал их в php для вас. http://armandbrahaj.blog.al/2009/04/14/list-of-english-stop-words/

Затем просто сделайте preg_replace для строки, которую вы индексируете.

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

Если вас беспокоит производительность, вы можете рассмотреть возможность использования поисковой системы, такой как Lucine (solr), вместо базы данных. Это сделает индексирование намного проще. Вы не хотите изобретать велосипед здесь.

1 голос
/ 23 июля 2010

Это ответ на ваш первоначальный вопрос, а затем ваш ответ / вопрос .

Я уже использовал поисковую систему Sphinx (довольно давно, поэтому я немного заржавел) и нашел ее очень хорошей, даже если иногда документации немного не хватает .

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

Я рекомендую прочитать Создайте пользовательскую поисковую систему с помощью PHP , прежде чем копаться в документации Sphinx . Если вы не думаете, что это подходит после прочтения этого, достаточно справедливо.

В ответ на ваши конкретные вопросы я собрал несколько ссылок из документации, а также некоторые соответствующие цитаты:

отфильтровывает общие слова (как вы, возможно, заметили, «список» «из» и «intel» отсутствуют в списке)

11.2.8. стоп-слова

Стоп-слова - это слова, которые не быть проиндексирован. Как правило, вы бы поставили большинство частые слова в списке стоп-слов потому что они не добавляют большую ценность результаты поиска, но потребляют много ресурсы для обработки.

Что касается «процессора» (множественное число против единственного числа), то лучше ли использовать конкретный тип (единственное или множественное число), оба или точные (т. Е. «Процессор» отличается от «процессора»)?

11.2.9. словоформы

Формы слова применяются после токенизацию входящего текста правила charset_table. Они существенно позвольте заменить одно слово другим. Как правило, это будет использовано для разные формы слова в одном нормальная форма (например, для нормализации всех варианты, такие как "прогулки", "гуляли", "гулять" до нормальной формы "гулять"). Он также может быть использован для реализации вытекающие исключения, потому что не применяется к словам, найденным в список форм.

Продолжая предыдущий пункт, как определить множественное число (разные вкусы: test => tests fish => fish and leaf => leaves)

Sphinx поддерживает Алгоритм управления портерами

Алгоритм определения портера (или «Портер Стеммер» - это процесс для устранение простуды морфологического и флексиональные окончания слов в Английский. Его основное использование как часть термин процесс нормализации, который обычно делается при настройке Информационно-поисковые системы.

Допустим, я хотел использовать поисковый термин "vendor: intel", где vendor указывает имя поля (field_name), как вы думаете, это окажет огромное влияние на сервер sql?

3,2. Атрибуты

Хорошим примером для атрибутов будет таблица сообщений форума. Предположим, что только поля заголовка и содержания должны быть полнотекстовый поиск - но это иногда также требуется ограничить поиск определенного автора или подфорум (т. е. искать только эти строки которые имеют некоторые конкретные значения столбцы author_id или forum_id в Таблица SQL); или сортировать совпадения по столбец post_date; или для группирования соответствия сообщений по месяцу post_date и рассчитать количество совпадений для каждой группы.

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

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

оператор поиска поля: @vendor intel

Как поисковая система индексирует набор полей и связывает найденные фразы / ключевые слова / и т. Д. С конкретным идентификатором поля?

8.6.1.Query

В случае успеха Query () возвращает набор результатов, который содержит некоторые из найденных совпадений (согласно запросу SetLimits ()) и дополнительную общую статистику по каждому запросу.> Результирующий набор представляет собой хеш (специфичный для PHP; другие языки могут использовать другие структуры вместо хеша) со следующими ключами и значениями:

"соответствует":
Хеш, который отображает идентификаторы найденного документа в другой маленькийхэш, содержащий вес документа и значения атрибутов (или массив похожих небольших хэшей, если SetArrayResult () был включен).

"total":
Общее количество совпадений, полученных на сервере (т. е. на серверпобочный результат) по этому запросу.Вы можете получить до этого количества совпадений с сервера для этого текста запроса с текущими настройками запроса.

"total_found":
Общее количество соответствующих документов в индексе (которые были найдены и обработаны на сервере).

"words":
Хеш, который отображает ключевые слова запроса (сложенные, запаздывающие и иным образом обработанные) в небольшой хеш со статистикой по ключевым словам ("документы", "попадания").

"error":
Запрос об ошибке, о котором сообщает searchd (строка, читаемая человеком).Пусто, если ошибок не было.

"warning":
Запрос предупреждения, отправленный searchd (строка, читаемая человеком).Пусто, если не было предупреждений.

Также см. Листинг 11 и Листинг 13 из Создание пользовательского поискового движка с PHP .

1 голос
/ 23 июля 2010

отфильтровывая общие слова (как вы возможно, заметил, что "" является "" из "и в списке отсутствуют "intel")

Найти (или создать) список общих слов и отфильтровать вводимые пользователем данные.

Что касается "процессора" (множественное число против единственное число), было бы лучше использовать определенный тип (единственное или множественное число), оба или точные (т. е. «процессор» отличается "Процессор")?

Зависит. Я бы искал оба, если бы это не было большим бременем; или для единственного числа, используя предложение LIKE, если это возможно.

Продолжая с предыдущим пунктом, как можно Я определяю множественное число (разные вкусы: тест => тестирует рыбу => рыбу и лист => листья)

Создать метод или класс Inflector. то есть: Inflect::plural('fish') дает вам 'fish'. Для английского языка могут быть такие классы, посмотрите их.

Я сейчас использую MySql и очень занимается вопросами производительности; мы есть более 500 категорий, и мы не сделали даже запустить сайт

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

Допустим, я хотел использовать поиск термин "продавец: Intel", где продавец указывает имя поля (field_name), Как вы думаете, будет огромный влияние на сервер sql?

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

Дросселирование поиска; Мне это не нравится на всех, но это возможно, и если Вы знаете какие-либо обходные пути, сделать себя услышал!

Здесь не так много вариантов. Чтобы помочь здесь и в производительности, вам следует подумать о том, чтобы иметь какое-то кэширование.

1 голос
/ 23 июля 2010

Я бы сердечно предложил вам взглянуть на Solr.Это автономная система поиска и индексации на основе Java, которая, вероятно, имеет больше преимуществ, чем решение PHP.

0 голосов
/ 23 июля 2010

Существует PHP-реализация тэгера Brill Part of Speech на php / ir .Это может обеспечить основу для определения тех слов, которые должны быть отброшены, и тех, которые вы хотите проиндексировать, в то же время он также определяет множественное число (и корень единственного числа).Он не идеален, хотя пользовательский словарь для работы с техническими терминами может оказаться полезным для решения первых трех вопросов.

0 голосов
/ 23 июля 2010

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

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

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

0 голосов
/ 23 июля 2010

Поиск сложно осуществить. Рекомендую использовать пакет, если вы новичок в этом.

Рассматривали ли вы http://framework.zend.com/manual/en/zend.search.lucene.html?

...