Задать вопрос
  • Как убрать —secure-file-priv в MySQL 5.7?

    @vadamlyuk
    В /etc/my.cnf в секцию [mysqld] нужно добавить строку

    secure-file-priv = ""

    И перезапустить mysqld:

    service mysqld restart
    Ответ написан
    Комментировать
  • Как обновить данные кэша CPHPCache в 1С-Битрикс?

    @vadamlyuk
    Действительно, в официальной документации этот вопрос не рассмотрен.
    Если с в кэше лежит валидный кэш с неистекшим TTL, то Вам не удастся его обновить.

    Правильное решение - очистить кэш и добавить новое значение,
    только не нужно вызывать ->clearDir(), достаточно вызвать ->clear() с соответсвующим тэгом
    Ответ написан
    Комментировать
  • Ранжирование sphinx: как поднять в топ выдачи точные совпадения?

    @vadamlyuk Автор вопроса
    UPD. Сам отвечаю на свой вопрос:
    1. Если использовать расширенный язык запрос, то там есть такое понятие, как "IDF booster", что собственно и есть вес поискового слова (к сожалению, в ranker expression этот чистый вес использовать нельзя, можно только взять в связке с IDF. для моего случая это не важно, но ниже объяснию когда это может быть проблемой)
    Веса выставляются после каждого слова через знак ^:

    ... where match('(тест^100|тест*^5|*тест*)') ...

    2. Пишем собственное ranker expression (формулу, по которой производится ранжирование) и считаем в ней сумму tf_idf (которое является произведением tf - количества раз, которое встречается поисковое слово в запросе и idf (которое в свою очередь является произведением веса слова, заданного вами в запросе на некий коэффициент)). Важно отметить, что для тест* и *тест* почему-то имеет отрицательное значение (хотя в документации сказано, что idf без учета веса может принимать значения от 0 до 1), по этому в нашем случае берем его абсолютное значение и полностью запрос будет выглядеть так:

    select *,weight() from rttest2 where match('(тест^100|тест*^5|*тест*)') option ranker=expr('sum(abs(tf_idf)*1000)');
    
    +------+------------------------------------------+----------+
    | id   | phrase1                                  | weight() |
    +------+------------------------------------------+----------+
    |    1 | очень простой тест                       |    14423 |
    |    4 | тестировщик тестов                       |     1846 |
    |    5 | тестик тестик простой                    |     1846 |
    |    2 | хитрый тестик                            |      923 |
    |    3 | супертестик                              |      155 |
    +------+------------------------------------------+----------+


    Теперь обещанная сноска по поводу IDF:
    Согласно этому объяснению автора:
    IDF это очередная магическая метрика, которая учитывает «редкость» слова: для суперчастых слов (которые есть в каждом документе) она равна 0, а для уникального слова (1 вхождение в 1 документ во всей коллекции) равна 1.

    Т.е. для словоформ одного слова со звездочками и без значения IDF будут равны,
    т.е. для слов тест, тест* и *тест* IDF будет практически прямо пропорционален весу, который вы задали в запросе

    Но если Вы хотите проделать этот же трюк со словами "это" и "контрвзбзднуть" в варианте запроса "или или", то скорей всего у Вас ничего не получится, так как IDF будет сильно зависить от набора документов, которые у Вас содержаться в индексе. По этому конечно было бы классно, если можно было задавать вес просто конкретному слову, без привязки к idf
    Ответ написан
    Комментировать