为在线商店配置Sphinx搜索

关于狮身人面像的信息并不如我们所愿。 多余的文章不伤人。
Sphinx开发的第一步帮助我撰写了以下文章: 在Sphinx + phpSphinx 上创建介绍性搜索引擎在 真实项目中的示例搜索-Tecdoc汽车配件商店,我建议您从它们开始。


一段时间以来,通过LIKE搜索查询的每个单词在我的网站上都有效。 我想要更多,以下是一些可以正确处理的情况:


  • 单词形式。 “螺钉”和“螺钉”的输出应相同。
  • 按单词片段搜索。
  • 搜索非整数。 分隔点和逗号。
  • 字母y
  • 常见错误。 例如,“减震器”。
  • 同义字 调节器和电调。
  • 语言 mAh和mAh,B和V,AAA拉丁和西里尔字母。
  • 单词由字母和数字。 10x15x4,6000mAh

源代码部分和可选排序


该发行应首先包含库存物品,然后暂时缺货,然后存档。 所有这三个组应按相关性排序。 为此,您需要设置属性。 就我而言,这些是源sphinx.conf部分的clear和in_stock字段


sql_query = \ SELECT id, `art`, `name`, `clearance`, `in_stock` \ FROM items_zip WHERE show_flag=1 sql_attr_bool = clearance sql_attr_uint = in_stock 

这些字段将用于在PHP中生成输出。 我将在下面描述。


sphinx.conf中的索引部分


形态= stem_enru
形态学解决了我的第一个问题。 搜索“轴承”,“轴承”,“轴承”将得到一个结果。


词干(stem_enru)更快,词条(lemmatize_ru)更准确。 我只尝试了雄蕊。 选择将影响您的单词形式替换字典。 要更改-您必须重写。


min_word_len = 1
任何长度的索引字。


html_strip = 1
删除HTML标签


min_infix_len = 1
搜索将在单词的一部分上进行。 索引片段最多1个字母。 由于数据库中的项目少于10,000,因此我不会保存索引。


expand_keywords = 1
自动将查询引导为“(running | running | = running)”形式。 min_infix_len和expand_keywords将导致RV 2205发出RV2205。 顺便说一句,破折号是相当于空格的分隔符。 因此,RV-2205将提供相同的RV2205。


charset_table = 0..9,A..Z-> a..z,_,a..z,U + 410..U + 42F-> U + 430..U + 44F,U + 430..U + 44F,U + 401-> U + 0435,U + 451-> U + 0435
我们将拉丁字母和西里尔字母小写。 with用e代替。


blend_chars = +,&,U + 2C,U + 2E
我有很多非整数数字。 它们需要被完全索引。 U + 2C和U + 2E是点和逗号。 例如,1.25将被索引为“ 1.25”,“ 1”和“ 25”。


regexp_filter =(\ d +)\,(\ d +)=> \ 1. \ 2
小数位数可以用句点和逗号分隔:“ 1.75”,“ 1.75”。 我们把一切都带到重点


同义词和错别字


度量单位可以用俄语或英语书写:mm-mm,mAh-mAh,mW-mW。 添加到同义词词典中,以单词形式指定的路径:“ mach> mah”。 我根据自己的喜好选择索引的语言。


〜符号表示在形态处理程序之后应用替换。 这使您无需编写所有单词形式,而可以使用“结皮”,“结皮”,“结皮”的规则来编写“〜cork> body”


我的清单是完整的:


 ~ > esc  > esc  > mah ~ >  ~ >  ~ > buzz ~ > buzz ~ > buzz ~ > buzz ~ > buzz ~ >  ~ >  ~ >  li-po > lipo ~ >  ~ >   >   >  vtx >  ~ >  lollipop > lolipop battery >  ~ >  ~ >  ~ >  mkF >   > BEC  > BEC ~ >  LED >  ~ >  driver >  ~ >  ~ >   > AAA  > AA  > M mm >   > mW  > V  > A deans > t-plug tplug > t-plug 

在数字上粘贴字母


有时数字是名称的一部分(例如LCD5208D),但更常见的是特性(100mAh,10x15x4mm)。 将所有数字与字母和索引分开。


这将解决几个问题:


  • 有人会寻找“轴承10x15x4”,有人会寻找“轴承15x10x4”。 索引编号将导致正确的输出。
  • 度量单位可以与数字“ 1.75mm”,“ 1.75mm”之间用空格隔开,也可以不隔开。
  • 对于标题,这也很有用。 正确的输出将在三个记录选项LCD-5208,LCD 5208和LCD5208中

在编写正则表达式以分隔数字之前,需要统一定界符。 重要的是要记住,正则表达式是全部并按顺序执行的。


我们删除x,他和大小为10x4x4 M3x10的星星:


 regexp_filter = (\d+)[x\x{0445}\*] => \1 x 

甩尾巴:


 regexp_filter = (\d*\.?\d+)(\D+) => \1 \2 

和头:


 regexp_filter = (\D+)(\d*\.?\d+) => \1 \2 

我们丢弃“ mm”,因为它们通常不会在产品名称中指出。
制作一个stop.txt文件,并将其写入停用词中。
内容:


  mm 

现在介绍一下PHP


Sphinxapi迟早会被描述。 我们将使用Sphinxql。 为此,请连接到数据库。 就我而言,Sphinx是通过托管连接的,它看起来像这样:


 $opt = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => TRUE, ); $dsn = 'mysql:host=127.0.0.1;port=9306;'; $this->pdo = new PDO($dsn, DB_USER, DB_PASS, $opt); 

与Spinxql的所有通信都是一个SELECT传输经过过滤的查询文本


 $stmt = $this->pdo->prepare("SELECT `id`, WEIGHT() as `w`, in_stock>0 AS stock FROM `items` WHERE MATCH ('".$search."') ORDER BY clearance ASC, stock DESC, w DESC LIMIT ".$limit." OPTION field_weights=(name=10, art=3, cat_names=3, model_names=3)"); 

SphinxQL无法理解ORDER BY排序部分中的表达式,因此必须将WEIGHT()和in_stock> 0放入字段中。 顺便说一句,默认限制为20。


排序将首先产生库存项目,然后暂时缺货,然后存档。 所有这三个组将按相关性(权重)排序。


通过field_weights,我们可以设置哪些字段的权重更大。


通过完成请求,我们得到了一个排序的id数组。 但是,不幸的是,通过WHERE id IN()选择数据将违反这种排序方式。 必须为每个ID形成您的请求。


在调试阶段紧跟在SELECT查询之后的SHOW META查询很有帮助 。 特别是用于检查字典字形和正则表达式过滤器。 您可以查看查询已扩展到的关键字列表。


复杂的sql_query


我们出售零件。 我决定添加产品类别的名称和打算将其零件添加到索引的模型的名称。 但是每种产品可以一次绑定到多个类别,并适用于多种型号。 我发现了GROUP_CONCAT函数,它允许您通过分组为字符串来获取数据。 例如,category.name字段将包含所选项目的所有类别,用空格分隔。


 SELECT items_zip.id, `art`, items_zip.`name`, `clearance`, `in_stock`, GROUP_CONCAT(DISTINCT categories.name SEPARATOR ' ') AS cat_names, GROUP_CONCAT(DISTINCT items.family SEPARATOR ' ') AS model_names FROM items_zip LEFT JOIN items_cat ON items_cat.item_id=items_zip.id LEFT JOIN categories ON categories.id=items_cat.cat_id LEFT JOIN zip_comp ON zip_comp.zip_id=items_zip.id LEFT JOIN items ON zip_comp.model_id=items.id WHERE items_zip.show_flag=1 GROUP BY items_zip.id 

Source: https://habr.com/ru/post/zh-CN439018/


All Articles