<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Форум ReadyScript &mdash; Подсистема поиска. Оптимизация, улучшение]]></title>
		<link>https://forum.readyscript.ru/topic/1639/podsistema-poiska-optimizatsiya-uluchshenie/</link>
		<atom:link href="https://forum.readyscript.ru/feed/rss/topic/1639" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Подсистема поиска. Оптимизация, улучшение».]]></description>
		<lastBuildDate>Mon, 11 May 2020 15:07:31 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Подсистема поиска. Оптимизация, улучшение]]></title>
			<link>https://forum.readyscript.ru/post/11117/#p11117</link>
			<description><![CDATA[<p>В общем то, для артикулов вида DSD-23-23-dsds отдельно модуль приходится делать, добавляющий DSD2323dsds в список.<br />А как быть с обрезанием окончания? &quot;Чернила&quot; не находятся, зато &quot;2D чехол черный&quot; выводится</p>]]></description>
			<author><![CDATA[null@example.com (Ярослав)]]></author>
			<pubDate>Mon, 11 May 2020 15:07:31 +0000</pubDate>
			<guid>https://forum.readyscript.ru/post/11117/#p11117</guid>
		</item>
		<item>
			<title><![CDATA[Re: Подсистема поиска. Оптимизация, улучшение]]></title>
			<link>https://forum.readyscript.ru/post/11116/#p11116</link>
			<description><![CDATA[<div class="quotebox"><cite>Ярослав пишет:</cite><blockquote><div class="codebox"><pre><code>   /**
     * Возвращает подготовленную для поиска likePlus строку
     *
     * @param string $query
     * @return string
     */
    protected function prepareLikePlusString($query)
    {
        $config = ConfigLoader::byModule(&#039;search&#039;);
        $dis = preg_split(&#039;//u&#039;, html_entity_decode($config[&#039;search_type_likeplus_ignore_symbols&#039;]), -1, PREG_SPLIT_NO_EMPTY);

        return str_replace($dis, &#039; &#039;, mb_strtolower($query));
    }</code></pre></div><p>Уважаемые разработчики, подскажите, пожалуйста, почему замена идет на пробел, а не просто вырезается символ?<br />У меня с пробелом артикулы, маркировку не ищет. В поле indextext данные идут слитно, но при поиске тире, например, заменетс на пробел и поиск не работает.<br />Ставлю </p><div class="codebox"><pre><code>   return str_replace($dis, &#039;&#039;, mb_strtolower($query));</code></pre></div><p> все замечательно работает</p></blockquote></div><br /><p>Суть опции - search_type_likeplus_ignore_symbols, указать символы, которые будут считаться разделителями слов. Поиск like+ все равно идет по всем словам.</p><p>Эта опция не должна формировать новые слова. В случае разделителя &#039;&#039;[пустая строка], Редискрипт будет заниматься формированием новых слов из кусочков других слов.</p><p>Плюсом является наглядность при просмотре базы, что и как там сформировалось.</p>]]></description>
			<author><![CDATA[null@example.com (admin)]]></author>
			<pubDate>Mon, 11 May 2020 09:10:27 +0000</pubDate>
			<guid>https://forum.readyscript.ru/post/11116/#p11116</guid>
		</item>
		<item>
			<title><![CDATA[Re: Подсистема поиска. Оптимизация, улучшение]]></title>
			<link>https://forum.readyscript.ru/post/11115/#p11115</link>
			<description><![CDATA[<p>Намучался я с поиском. stemmer урезает слово &quot;чернила&quot; до &quot;черн&quot;. В поиске куча товаров просто со словом &quot;черный&quot;</p>]]></description>
			<author><![CDATA[null@example.com (Ярослав)]]></author>
			<pubDate>Sun, 10 May 2020 23:45:35 +0000</pubDate>
			<guid>https://forum.readyscript.ru/post/11115/#p11115</guid>
		</item>
		<item>
			<title><![CDATA[Re: Подсистема поиска. Оптимизация, улучшение]]></title>
			<link>https://forum.readyscript.ru/post/11114/#p11114</link>
			<description><![CDATA[<div class="codebox"><pre><code>   /**
     * Возвращает подготовленную для поиска likePlus строку
     *
     * @param string $query
     * @return string
     */
    protected function prepareLikePlusString($query)
    {
        $config = ConfigLoader::byModule(&#039;search&#039;);
        $dis = preg_split(&#039;//u&#039;, html_entity_decode($config[&#039;search_type_likeplus_ignore_symbols&#039;]), -1, PREG_SPLIT_NO_EMPTY);

        return str_replace($dis, &#039; &#039;, mb_strtolower($query));
    }</code></pre></div><p>Уважаемые разработчики, подскажите, пожалуйста, почему замена идет на пробел, а не просто вырезается символ?<br />У меня с пробелом артикулы, маркировку не ищет. В поле indextext данные идут слитно, но при поиске тире, например, заменетс на пробел и поиск не работает.<br />Ставлю </p><div class="codebox"><pre><code>   return str_replace($dis, &#039;&#039;, mb_strtolower($query));</code></pre></div><p> все замечательно работает</p>]]></description>
			<author><![CDATA[null@example.com (Ярослав)]]></author>
			<pubDate>Sun, 10 May 2020 19:41:56 +0000</pubDate>
			<guid>https://forum.readyscript.ru/post/11114/#p11114</guid>
		</item>
		<item>
			<title><![CDATA[Re: Подсистема поиска. Оптимизация, улучшение]]></title>
			<link>https://forum.readyscript.ru/post/10799/#p10799</link>
			<description><![CDATA[<p>Перестал производится полнотекстовый поиск по 4 символам. Хотя в настройках mysql минимальная длина слова стоит вообще 3.<br />Оказывается, в обновлениях RS <br /></p><div class="codebox"><pre><code>  protected function getStemmedQuery()
    {
        //Если в поисковой строке найдены кавычки,
        //не применяем эвристических методов улучшения результатов.
        //Считаем, что пользователь опытный, сам составляет запрос.
        if (strpos($this-&gt;query, &quot;\&quot;&quot;) !== false) return $this-&gt;query;
        
        
        $words = preg_split(&#039;/[\s,]+/u&#039;, $this-&gt;query, -1, PREG_SPLIT_NO_EMPTY);
        $stemmer = new \Search\Model\Stem\Ru();
        
        $query = $this-&gt;query;
        foreach($words as $word) {
            //Если перед словом не будет задан спец-символ, ставим + (слово обязательно должно присутствовать в результате)
            if (!preg_match(&#039;/[+\-&quot;~(&lt;&gt;]/&#039;, mb_substr($word,0,1))) {
                $query = str_replace($word, &#039;+&#039;.$word, $query);
            }
            
            $stemmed = $stemmer-&gt;stemWord($word);
            if (mb_strlen($stemmed)&gt;3) {//Если после стеминга слово не стало менее 4-х символов, то 
                $query = str_replace($word, $stemmed.&#039;*&#039;, $query);
            }
        }

        return $query;
    }</code></pre></div><p>Ранее было <br /></p><div class="codebox"><pre><code> if (mb_strlen($stemmed)&gt;2) {//Если после стеминга слово не стало менее 4-х символов, то 
                $query = str_replace($word, $stemmed.&#039;*&#039;, $query);
            }</code></pre></div><p>Стало:<br /></p><div class="codebox"><pre><code> if (mb_strlen($stemmed)&gt;3) {//Если после стеминга слово не стало менее 4-х символов, то 
                $query = str_replace($word, $stemmed.&#039;*&#039;, $query);
            }</code></pre></div><p>Пришлось скорректировать обратно. Поиск с 3-х букв заработал.<br />Я не пойму, почему даже по 4 не искало, только с 5, а сейчас с 3-х находит.<br />Хорошо бы в настройки вывести, потому как при маленькой базе и с 2-х символов искать можно.</p>]]></description>
			<author><![CDATA[null@example.com (Ярослав)]]></author>
			<pubDate>Mon, 02 Dec 2019 10:14:58 +0000</pubDate>
			<guid>https://forum.readyscript.ru/post/10799/#p10799</guid>
		</item>
		<item>
			<title><![CDATA[Re: Подсистема поиска. Оптимизация, улучшение]]></title>
			<link>https://forum.readyscript.ru/post/10469/#p10469</link>
			<description><![CDATA[<p>Благодарю, Ярослав</p>]]></description>
			<author><![CDATA[null@example.com (Андрей)]]></author>
			<pubDate>Wed, 02 Oct 2019 01:34:09 +0000</pubDate>
			<guid>https://forum.readyscript.ru/post/10469/#p10469</guid>
		</item>
		<item>
			<title><![CDATA[Re: Подсистема поиска. Оптимизация, улучшение]]></title>
			<link>https://forum.readyscript.ru/post/10430/#p10430</link>
			<description><![CDATA[<div class="quotebox"><cite>Андрей пишет:</cite><blockquote><p>Здравствуйте, Ярослав.<br />Продемонстрируйте конечный код если возможно.</p></blockquote></div><p>В файле /catalog/contrloller/fron/listproducts.inc.php примерно в 66 строке идет присваивание переменной текущей настройки&nbsp; модуля поиска.<br /></p><div class="codebox"><pre><code> $this-&gt;search_type = ConfigLoader::byModule(&#039;search&#039;)-&gt;searchtype;</code></pre></div><p>Надо добавить символ подчеркивания _:<br /></p><div class="codebox"><pre><code> $this-&gt;search_type = ConfigLoader::byModule(&#039;search&#039;)-&gt;search_type;</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Ярослав)]]></author>
			<pubDate>Thu, 26 Sep 2019 16:25:53 +0000</pubDate>
			<guid>https://forum.readyscript.ru/post/10430/#p10430</guid>
		</item>
		<item>
			<title><![CDATA[Re: Подсистема поиска. Оптимизация, улучшение]]></title>
			<link>https://forum.readyscript.ru/post/10423/#p10423</link>
			<description><![CDATA[<p>Здравствуйте, Ярослав.<br />Продемонстрируйте конечный код если возможно.</p>]]></description>
			<author><![CDATA[null@example.com (Андрей)]]></author>
			<pubDate>Thu, 26 Sep 2019 01:15:15 +0000</pubDate>
			<guid>https://forum.readyscript.ru/post/10423/#p10423</guid>
		</item>
		<item>
			<title><![CDATA[Re: Подсистема поиска. Оптимизация, улучшение]]></title>
			<link>https://forum.readyscript.ru/post/10413/#p10413</link>
			<description><![CDATA[<p>Александр, написал. <br />Все сайты на техподдержке исправил, теперь просто конфетка, а не поиск</p>]]></description>
			<author><![CDATA[null@example.com (Ярослав)]]></author>
			<pubDate>Wed, 25 Sep 2019 07:42:55 +0000</pubDate>
			<guid>https://forum.readyscript.ru/post/10413/#p10413</guid>
		</item>
		<item>
			<title><![CDATA[Re: Подсистема поиска. Оптимизация, улучшение]]></title>
			<link>https://forum.readyscript.ru/post/10410/#p10410</link>
			<description><![CDATA[<p>Напишите пожалуйста в поддержку.</p>]]></description>
			<author><![CDATA[null@example.com (Закусило Александр)]]></author>
			<pubDate>Wed, 25 Sep 2019 07:31:26 +0000</pubDate>
			<guid>https://forum.readyscript.ru/post/10410/#p10410</guid>
		</item>
		<item>
			<title><![CDATA[Re: Подсистема поиска. Оптимизация, улучшение]]></title>
			<link>https://forum.readyscript.ru/post/10406/#p10406</link>
			<description><![CDATA[<p>Разобрался. У вас ошибка в коде в 66 строке<br /></p><div class="codebox"><pre><code>  $this-&gt;search_type = ConfigLoader::byModule(&#039;search&#039;)-&gt;searchtype;</code></pre></div><p>Вместо searchtype надо search_type, <br /></p><div class="codebox"><pre><code>  $this-&gt;search_type = ConfigLoader::byModule(&#039;search&#039;)-&gt;search_type;</code></pre></div><p>И еще с 3 версии сортировка по релевантности не работает. (((((((((((((((((((((((<br />Я и смотрю, запрос, сформированный модулем поиск&nbsp; великолепно выводит данные, а товары на сайте непонятно как выведены.</p>]]></description>
			<author><![CDATA[null@example.com (Ярослав)]]></author>
			<pubDate>Tue, 24 Sep 2019 16:16:55 +0000</pubDate>
			<guid>https://forum.readyscript.ru/post/10406/#p10406</guid>
		</item>
		<item>
			<title><![CDATA[Re: Подсистема поиска. Оптимизация, улучшение]]></title>
			<link>https://forum.readyscript.ru/post/10405/#p10405</link>
			<description><![CDATA[<p>Опять мучаю стандартный поиск<br />Вопрос к разработчикам. Заметил, что при любом типе поиска сортировка слетает, так как контроллер ListProducts в 247 <br />просто устанавливает свою сортировку. Это неправильно! При полнотекстовом поиске, например, идет сортировка по релевантности, а она сбрасывается на сортировку по-умолчанию. <br />Может быть не устанавливать сортировку при наличии запроса на поиск и неустановленной принудительной сортировке? Пока просто перенес установку сортировки:<br /></p><div class="codebox"><pre><code>//Устанавливаем сортировку
                //$sort_field = $this-&gt;cur_sort == &#039;rank&#039; ? $this-&gt;cur_sort : $this-&gt;api-&gt;defAlias().&#039;.&#039;.$this-&gt;cur_sort;
                //$this-&gt;api-&gt;setSortOrder($sort_field, $this-&gt;cur_n_sort);
                
                if (!empty($this-&gt;query) &amp;&amp; $dir == 0) { //Если это результат поиска, 
                    $sub_dirs = $this-&gt;api-&gt;getDirList(); //Загружаем список категорий, в которых найдены товары
                } else {
                   //eventus
                    $sort_field = $this-&gt;cur_sort == &#039;rank&#039; ? $this-&gt;cur_sort : $this-&gt;api-&gt;defAlias().&#039;.&#039;.$this-&gt;cur_sort;
                    $this-&gt;api-&gt;setSortOrder($sort_field, $this-&gt;cur_n_sort);
                
                    //Загружаем список подактегорий, у текущей категории
                    $this-&gt;dirapi-&gt;setFilter(&#039;parent&#039;, $dir_id);      
                    $this-&gt;dirapi-&gt;setFilter(&#039;public&#039;, 1);
                    $sub_dirs = $this-&gt;dirapi-&gt;getList();
                }</code></pre></div><p>Стоит сортировка по-умолчанию по дате создания товара.<br />Было в результатах поиска:<br /></p><div class="quotebox"><blockquote><p>Подставка для шоколада<br />...куча другого товара с шоколадом в 20-й позиции<br />Шоколад такой то</p></blockquote></div><p>Стало:<br /></p><div class="quotebox"><blockquote><p>Шоколад такой то<br />Подставка для шоколада<br />...куча другого товара с шоколадом в 20-й позиции</p></blockquote></div><p>Сортировка order by RANK просто напросто игнорируется в стандартном коде. Или я чего то не понимаю. </p><p>p.s.<br />Кстати, для поиска like можно добавить сортировку через LOCATE, тогда результаты замечательно сортируются по вхождению строки:<br /></p><div class="codebox"><pre><code>ORDER BY LOCATE(&#039;шоколад&#039;,B.`title`)</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Ярослав)]]></author>
			<pubDate>Tue, 24 Sep 2019 16:01:28 +0000</pubDate>
			<guid>https://forum.readyscript.ru/post/10405/#p10405</guid>
		</item>
		<item>
			<title><![CDATA[Re: Подсистема поиска. Оптимизация, улучшение]]></title>
			<link>https://forum.readyscript.ru/post/9688/#p9688</link>
			<description><![CDATA[<div class="codebox"><pre><code>о каком public&#039;е Вы все пишите?

качественно перенесли старые баги!

Вы бы хоть написали об этом, а то кто-то на радостях скачает и радости не ощутит smile</code></pre></div><p>Мне уже начинает надоедать ваша манера общения. Кто хочет, тот применит, если надо исправит. Какой public понятно из пункта 1 вашего же вопроса.</p>]]></description>
			<author><![CDATA[null@example.com (Ярослав)]]></author>
			<pubDate>Sat, 23 Mar 2019 00:25:24 +0000</pubDate>
			<guid>https://forum.readyscript.ru/post/9688/#p9688</guid>
		</item>
		<item>
			<title><![CDATA[Re: Подсистема поиска. Оптимизация, улучшение]]></title>
			<link>https://forum.readyscript.ru/post/9687/#p9687</link>
			<description><![CDATA[<div class="quotebox"><cite>Ярослав пишет:</cite><blockquote><p>В версии на текущую дату public есть, но нет его в транслитерации. Забыли видимо</p></blockquote></div><p>о каком public&#039;е Вы все пишите?<br /></p><div class="quotebox"><cite>Ярослав пишет:</cite><blockquote><p>1. В исходном коде этого не было</p></blockquote></div><p>качественно перенесли старые баги! <br /></p><div class="quotebox"><cite>Ярослав пишет:</cite><blockquote><p>3. Методов не хватает, так как делалось для старой версии 3, там их нет.</p></blockquote></div><p>Вы бы хоть написали об этом, а то кто-то на радостях скачает и радости не ощутит <img src="https://forum.readyscript.ru/img/smilies/smile.png" width="15" height="15" alt="smile" /></p>]]></description>
			<author><![CDATA[null@example.com (EnsoStudio)]]></author>
			<pubDate>Fri, 22 Mar 2019 23:05:14 +0000</pubDate>
			<guid>https://forum.readyscript.ru/post/9687/#p9687</guid>
		</item>
		<item>
			<title><![CDATA[Re: Подсистема поиска. Оптимизация, улучшение]]></title>
			<link>https://forum.readyscript.ru/post/9686/#p9686</link>
			<description><![CDATA[<div class="codebox"><pre><code>    /**
     * Возвращает результаты поиска по категориям в зависимости от запроса
     *
     * @param string $query - строка для поиска
     * @param integer $limit - лимит результатов поиска
     *
     * @return \Catalog\Model\Orm\Dir[]
     */
    function getSearchQueryCategoryResults($query, $limit = 1)
    {
        $list = $this-&gt;dirapi
                        -&gt;setFilter(&#039;name&#039;, $query, &#039;%like%&#039;)
                        -&gt;setFilter(&#039;public&#039;, 1)
                        -&gt;getList(1, $limit);

        //Если не нашли результаты, то посмотрим странслитом
        if (empty($list)){
            $query = Transliteration::puntoSwitchWord($query);
            $list = $this-&gt;dirapi-&gt;clearFilter()-&gt;setFilter(&#039;name&#039;, &quot;%$query%&quot;,&#039;like&#039;)
                -&gt;getList(1, $limit);
        }
        return $list;
    }</code></pre></div><p>В версии на текущую дату public есть, но нет его в транслитерации. Забыли видимо</p>]]></description>
			<author><![CDATA[null@example.com (Ярослав)]]></author>
			<pubDate>Fri, 22 Mar 2019 22:41:35 +0000</pubDate>
			<guid>https://forum.readyscript.ru/post/9686/#p9686</guid>
		</item>
	</channel>
</rss>
