Ответы пользователя по тегу PHP
  • Как в сфинксе получить морфологические варианты слова?

    @klirichek
    Получить производные формы слова никак нельзя; aot изначально работает в прямо противоположном направлении (получает ИЗ производных исходные леммы).
    Вот леммы получить можно, но чуть муторно.
    Для этого добавляем в конфиге индекс с нужным лемматизатором (индексировать его необязательно, т.е. можно сказать что он rt и тогда демон взлетит с ним и без файлов индекса).
    типа:
    index fake_rt
    {
      ...
      rt_field = fake
      morphology = lemmatize_ru_all, lemmatize_en_all, lemmatize_de_all
    }


    Затем включаем профайлинг и делаем запрос к этому индексу с нужным словом. После смотрим план запроса.
    mysql> set profiling=1;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select * from rt_full where match ('стали');
    Empty set (0.00 sec)
    
    mysql> show plan;
    +------------------+--------------------------------------------------------------------------------------------------------+
    | Variable         | Value                                                                                                  |
    +------------------+--------------------------------------------------------------------------------------------------------+
    | transformed_tree | OR(
      AND(KEYWORD(сталь, querypos=1, morphed)), 
      AND(KEYWORD(стать, querypos=1, morphed)))           |
    +------------------+--------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)

    Из крайнего значения плана можно выкусить нужные формы внешними регэкспами
    Ответ написан
  • Как сгенерировать sphinx индекс программно?

    @klirichek
    Можно сделать так, чтобы своя программа генерила xml либо csv/tsv - и скормить получившийся поток сфинксу (через pipe).
    Ответ написан
  • Как получить из сфинкса уникальные свойства товаров и количество товаров с этими свойствами?

    @klirichek
    max_matches законфигурирован какой?

    (см. в доке: WARNING: grouping is done in fixed memory and thus its results are only approximate; so there might be more groups reported in total_found than actually present. @count might also be underestimated. To reduce inaccuracy, one should raise max_matches. If max_matches allows to store all found groups, results will be 100% correct. )
    Ответ написан
  • Как установить нужную версию sphinxapi?

    @klirichek
    Просто посмотрите версию.
    (запуск любой тулзы сфинкса без параметров выдаст баннер с версией).
    Потом тащите соответствующий тарболл с исходниками.

    Более верный способ - посмотрите, может мейнтейнер пакета выделил в отдельный пакет всякую сопроводиловку (какой-нибудь sphinx-dev например). Поищите в /usr/share/doc.
    Если нет вообще нигде - тащите таки из сорцов. И не забудьте написать "Кю!" мейнтейнеру пакета, покуда вообще-то api - это часть сфинкса.

    Ну и вообще универсальный совет - воспользуйтесь sphinxql. Тогда вообще никакое api не нужно, хватит стандартных функций из mysql/mysqli
    Ответ написан
  • Выход из условия if

    @klirichek
    Оборачиваем в любой цикл. Перед закрывающей скобкой цикла ставим break.
    В условии, где нужно выйти - тоже break.
    for (;;) {
      if( ... ){
        if( .. ){
        } else {
         // здесь нужно выйти из условия
        break;
        }
      }
    break;}


    (то же самое)
    while (true) {
      if( ... ){
        if( .. ){
        } else {
         // здесь нужно выйти из условия
        break;
        }
      }
    break;}


    (то же самое)
    do {
      if( ... ){
        if( .. ){
        } else {
         // здесь нужно выйти из условия
        break;
        }
      }
    break; } while (true);


    (то же самое)
    do {
      if( ... ){
        if( .. ){
        } else {
         // здесь нужно выйти из условия
        break;
        }
      }
    } while (false);


    Ну и стОит заметить, что если не пугаться goto, то ровно так же можно заюзать и его.
    (в дизасме получится в точности то же, что и с циклами)
    Ответ написан
  • Чем сжать pdf-файл?

    @klirichek
    Всё зависит от характера изображений.
    Если это сканы печатного текста - можно распознать или пустить в djvu.
    Если это штриховая чёрно-белая графика (без полутонов) - можно пережать в CCIT-4 (факсовое сжатие) и положить назад.
    Ответ написан
  • Sphinx: долгая загрузка тестовой php страницы - это нормально?

    @klirichek
    Скорее всего с портом намудрили.
    Дефолтный порт API - 9312.
    А 9306 - это для sphinxql.
    Ответ написан
  • Как найти вхождения сотен поисковых фраз в большом тексте (PHP, MySQL)?

    @klirichek
    В принципе, можно попробовать сделать в один проход.
    Для каждой фразы делаем ДКА состояний - чтоб ловить поступающие слова и двигать состояние вперёд, если совпадает с ожидающим следующим словом. Если слова закончились - запоминать найденную позицию и сбрасывать состояние. Если новое слово не совпадает - просто сбрасывать состояние.
    А дальше - организуем "игру в лото". Проходимся один раз по тексту от начала до конца и "объявляем" всем участвующим ДКА каждое слово. В конце залезаем в них и получаем списки "выигравших" позиций для каждой фразы.
    Это в общем. А дальше можно оптимизировать - например, сравнивать не слова, а хэшики от них.
    И не "объявлять" каждому "игроку" каждое слово, а собирать у них множество ожидаемых ими хэшиков - и если текущий попадает в множество - двигать состояния у "выигравших", а у всех остальных - сбрасывать.
    Ещё шаг - сделать не одно, а два множества. В одном - хэшики тех, что в начальном состоянии (при сбросе они не меняются -> не нужно читать значения заново). Во втором - "играющие".

    Здесь нужно побенчить по сравнению с indexof. Последний внутри себя, конечно, будет работать быстрее, чем аналогичный "самописный", однако на определённых параметрах (совокупность размера входного текста вместе с количеством и размером искомых фраз) уже может вполне его обойти за счёт меньшей сложности.
    Ответ написан
  • Как реализовать алгоритм поиска по имени и/или фамилии?

    @klirichek
    Да, это напрямую паттерн для сфинкса. Никаких особых ухищрений или преобразований не потребуется. Прямо так и индексируйте - имя в одном поле, фамилию в другом. Запрос "Вася пупкин" выдаст желаемое; кроме того можно делать селективный поиск типа "@name Вася" - только по полю "name".
    Абсолютно так же добавите никнейм (просто добавите колонку в выдачу rowset при индексации; а если там какой-нибудь select * - то даже конфиг сфинкса трогать не нужно; добавите колонку в таблице, а потом переиндексируете и всё "подхватится")
    Ответ написан