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

    @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
    Ответ написан
    2 комментария
  • Как настроить RT индекс shpinx для поддержки кириллицы?

    @klirichek
    charset_type всего лишь определял, какую кодировку (однобайтную или юникод) пихать в сфинкс. Очевидно, что однобайтная - пережиток прошлого (нужно возиться с кодовыми страницами и т.д.), потому её устранили. А поскольку их было всего две, то устранили и опцию.

    Тем не менее, charset_table никто не трогал, она по-прежнему работает. "аналогичного результата" с ней быть не может, проверяйте внимательнее!
    Собственно, это и есть ключ.

    charset_table определяет, как входной поток символов преобразуется перед тем, как его подхватит сфинкс. И ещё тут может повлиять ваш консольный клиент - потому что он тоже шлёт данные сфинксу в определённой кодировке.
    Вообще есть "волшебная команда" show meta. Её можно запустить сразу после запроса, и она покажет, какие именно слова и как искал сфинкс.
    Насколько я помню, раньше типичной проблемой было, когда как раз таки charset_type стоял в sbcs, а индексировали utf-8. Сейчас подобного уже быть не должно, но возможно что другое возникло.
    Ответ написан
    Комментировать
  • Почему Sphinx не находит исходное слово?

    @klirichek
    Смотрите show meta сразу после запроса. Там будет видно, какие именно сущности искал сфинкс.
    (возможно, "кварталу" не осилила морфология, к примеру).
    Ответ написан
    Комментировать
  • Как в Sphinx реализовать поиск по подстроке с учетом морфологии?

    @klirichek
    Вы кроме догадок ещё выхлоп фактических ключевых слов посмотрите.
    (в api есть в резултсете; в sphinxql нужно сказать show meta сразу после select)
    Ответ написан
    Комментировать
  • Размещение MySQL + Sphinx + отдача файлов

    @klirichek
    В сфинксе io-нагрузка в основном при старте/ротации индекса. А при поиске словарь и атрибуты лежат в памяти, с диска идёт обращение на чтение только к файлам spd/spp (случайное)
    Ответ написан
    Комментировать
  • Ошибка при создании и изменении таблицы с движком SPHINX?

    @klirichek
    Индекс создали, ок. А демона запустили? Который слушает localhost:9312 и обслуживает созданный индекс?
    Ответ написан
  • Sphinx: долгая загрузка тестовой php страницы - это нормально?

    @klirichek
    Скорее всего с портом намудрили.
    Дефолтный порт API - 9312.
    А 9306 - это для sphinxql.
    Ответ написан
    Комментировать
  • Как заставить Sphinx Search искать "*" в индексе?

    @klirichek
    Кстати, enable_star тут в любом случае не очень уместно. Звёздочка в этом случае будет спец.символом.
    Даже как багу зафиксят, останется разве что создавать индекс-дубль, где enable_star=0 и вручную рулить туда запросы на чистую "*".
    Ответ написан
    Комментировать
  • Как заставить Sphinx Search искать "*" в индексе?

    @klirichek
    Слова со звёздочкой в середине ищет.
    А вот обособленную звёздочку (where match ('*')) не желает. Более того, роняет демона.
    Похоже, бага
    Ответ написан
  • Поиск по параметрам на Sphinx API (php): нужен пинок?

    @klirichek
    OR не поддерживается только в правой части (после where). Однако ничего не мешает сделать нужное выражение в select-листе и заалиасить.
    (вроде select ... (attr OR attr between 30 and 100) as expr... where expr...)
    Ответ написан
  • Sphinx: получить количество значений mva-атрибута?

    @klirichek
    MVA - не vector а set.
    В нём сохраняется не всё подряд, как засунули - а только уникальные значения по возрастанию:
    - вставляете в атрибут (10,10,11,11,43,43,12,12)
    - по факту получаете там (10,11,12,43)

    У вас в принципе можно вообще сделать union и определить в индексе два поля - описание и "отзывы" (второе - joined_field из всех отзывов на данный товар) (при ft-поиске вам же неважно, какие именно отзывы; главное, чтобы те, что относятся к конкретному товару).
    id-шки отзывов (если вдруг нужны) можно положить в mva. Там же положить отдельный атрибут с их количеством.
    Получается схема вроде:
    a_product_id, f_description, f_joined_feedbacks, mva_feedbacks_ids, a_feedbacks_count
    Ответ написан
    Комментировать
  • Sphinx сопоставление индекса найденного значения одного MVA поля с другим?

    @klirichek
    Да, тут "в лоб" задача вообще не решаемая.
    у MVA НЕТ никаких индексов. Это аналог структуры Set, а не Vector. Внутри он для удобства хранится в отсортированном по возрастанию виде. Соответственно, ровно в момент когда вы поместите туда prices - дубли уберутся, сами цены отсортируются - и вся предполагаемая схема "развалится".
    Так что ваш вариант с включением цены в "primary key" - вполне хорош.
    Ещё (как вариация того же самого) можно положить цену в отдельное ft-поле (тогда в поиске получится что-то вроде '@title iPhone 5S @price 2500'. Или (ещё вариант) не в поле а в спец.токен ("price2500").
    Ответ написан
    Комментировать
  • Транслитерация в поиске

    @klirichek
    Можно charset_table настроить так, чтобы все русские буквы маппились сразу в латинницу. Проблема в том, что соответствие будет только буква-в-букву (т.е. отобразить ф->f можно, а вот ж->zh уже нет; нужно придумывать ОДНУ букву-соответствие.
    Но в вашем случае - a..zA..Z, Н->N о->o к->k и->i я->a (а также все остальные буквы)
    как раз приведёт к тому, что и Нокия и 'Nokia' - это будет одно и то же слово.
    Ответ написан
    Комментировать