<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Форум ReadyScript &mdash; Подсистема поиска. Оптимизация, улучшение]]></title>
	<link rel="self" href="https://forum.readyscript.ru/feed/atom/topic/1639/" />
	<updated>2020-05-11T15:07:31Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.readyscript.ru/topic/1639/podsistema-poiska-optimizatsiya-uluchshenie/</id>
		<entry>
			<title type="html"><![CDATA[Re: Подсистема поиска. Оптимизация, улучшение]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/11117/#p11117" />
			<content type="html"><![CDATA[<p>В общем то, для артикулов вида DSD-23-23-dsds отдельно модуль приходится делать, добавляющий DSD2323dsds в список.<br />А как быть с обрезанием окончания? &quot;Чернила&quot; не находятся, зато &quot;2D чехол черный&quot; выводится</p>]]></content>
			<author>
				<name><![CDATA[Ярослав]]></name>
				<uri>https://forum.readyscript.ru/user/74/</uri>
			</author>
			<updated>2020-05-11T15:07:31Z</updated>
			<id>https://forum.readyscript.ru/post/11117/#p11117</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Подсистема поиска. Оптимизация, улучшение]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/11116/#p11116" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[admin]]></name>
				<uri>https://forum.readyscript.ru/user/2/</uri>
			</author>
			<updated>2020-05-11T09:10:27Z</updated>
			<id>https://forum.readyscript.ru/post/11116/#p11116</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Подсистема поиска. Оптимизация, улучшение]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/11115/#p11115" />
			<content type="html"><![CDATA[<p>Намучался я с поиском. stemmer урезает слово &quot;чернила&quot; до &quot;черн&quot;. В поиске куча товаров просто со словом &quot;черный&quot;</p>]]></content>
			<author>
				<name><![CDATA[Ярослав]]></name>
				<uri>https://forum.readyscript.ru/user/74/</uri>
			</author>
			<updated>2020-05-10T23:45:35Z</updated>
			<id>https://forum.readyscript.ru/post/11115/#p11115</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Подсистема поиска. Оптимизация, улучшение]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/11114/#p11114" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Ярослав]]></name>
				<uri>https://forum.readyscript.ru/user/74/</uri>
			</author>
			<updated>2020-05-10T19:41:56Z</updated>
			<id>https://forum.readyscript.ru/post/11114/#p11114</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Подсистема поиска. Оптимизация, улучшение]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/10799/#p10799" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Ярослав]]></name>
				<uri>https://forum.readyscript.ru/user/74/</uri>
			</author>
			<updated>2019-12-02T10:14:58Z</updated>
			<id>https://forum.readyscript.ru/post/10799/#p10799</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Подсистема поиска. Оптимизация, улучшение]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/10469/#p10469" />
			<content type="html"><![CDATA[<p>Благодарю, Ярослав</p>]]></content>
			<author>
				<name><![CDATA[Андрей]]></name>
				<uri>https://forum.readyscript.ru/user/262/</uri>
			</author>
			<updated>2019-10-02T01:34:09Z</updated>
			<id>https://forum.readyscript.ru/post/10469/#p10469</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Подсистема поиска. Оптимизация, улучшение]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/10430/#p10430" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Ярослав]]></name>
				<uri>https://forum.readyscript.ru/user/74/</uri>
			</author>
			<updated>2019-09-26T16:25:53Z</updated>
			<id>https://forum.readyscript.ru/post/10430/#p10430</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Подсистема поиска. Оптимизация, улучшение]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/10423/#p10423" />
			<content type="html"><![CDATA[<p>Здравствуйте, Ярослав.<br />Продемонстрируйте конечный код если возможно.</p>]]></content>
			<author>
				<name><![CDATA[Андрей]]></name>
				<uri>https://forum.readyscript.ru/user/262/</uri>
			</author>
			<updated>2019-09-26T01:15:15Z</updated>
			<id>https://forum.readyscript.ru/post/10423/#p10423</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Подсистема поиска. Оптимизация, улучшение]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/10413/#p10413" />
			<content type="html"><![CDATA[<p>Александр, написал. <br />Все сайты на техподдержке исправил, теперь просто конфетка, а не поиск</p>]]></content>
			<author>
				<name><![CDATA[Ярослав]]></name>
				<uri>https://forum.readyscript.ru/user/74/</uri>
			</author>
			<updated>2019-09-25T07:42:55Z</updated>
			<id>https://forum.readyscript.ru/post/10413/#p10413</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Подсистема поиска. Оптимизация, улучшение]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/10410/#p10410" />
			<content type="html"><![CDATA[<p>Напишите пожалуйста в поддержку.</p>]]></content>
			<author>
				<name><![CDATA[Закусило Александр]]></name>
				<uri>https://forum.readyscript.ru/user/20/</uri>
			</author>
			<updated>2019-09-25T07:31:26Z</updated>
			<id>https://forum.readyscript.ru/post/10410/#p10410</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Подсистема поиска. Оптимизация, улучшение]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/10406/#p10406" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Ярослав]]></name>
				<uri>https://forum.readyscript.ru/user/74/</uri>
			</author>
			<updated>2019-09-24T16:16:55Z</updated>
			<id>https://forum.readyscript.ru/post/10406/#p10406</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Подсистема поиска. Оптимизация, улучшение]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/10405/#p10405" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Ярослав]]></name>
				<uri>https://forum.readyscript.ru/user/74/</uri>
			</author>
			<updated>2019-09-24T16:01:28Z</updated>
			<id>https://forum.readyscript.ru/post/10405/#p10405</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Подсистема поиска. Оптимизация, улучшение]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/9688/#p9688" />
			<content type="html"><![CDATA[<div class="codebox"><pre><code>о каком public&#039;е Вы все пишите?

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

Вы бы хоть написали об этом, а то кто-то на радостях скачает и радости не ощутит smile</code></pre></div><p>Мне уже начинает надоедать ваша манера общения. Кто хочет, тот применит, если надо исправит. Какой public понятно из пункта 1 вашего же вопроса.</p>]]></content>
			<author>
				<name><![CDATA[Ярослав]]></name>
				<uri>https://forum.readyscript.ru/user/74/</uri>
			</author>
			<updated>2019-03-23T00:25:24Z</updated>
			<id>https://forum.readyscript.ru/post/9688/#p9688</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Подсистема поиска. Оптимизация, улучшение]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/9687/#p9687" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[EnsoStudio]]></name>
				<uri>https://forum.readyscript.ru/user/1177/</uri>
			</author>
			<updated>2019-03-22T23:05:14Z</updated>
			<id>https://forum.readyscript.ru/post/9687/#p9687</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Подсистема поиска. Оптимизация, улучшение]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/9686/#p9686" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Ярослав]]></name>
				<uri>https://forum.readyscript.ru/user/74/</uri>
			</author>
			<updated>2019-03-22T22:41:35Z</updated>
			<id>https://forum.readyscript.ru/post/9686/#p9686</id>
		</entry>
</feed>
