【问题标题】:Matching key words in mysql database匹配mysql数据库中的关键字
【发布时间】:2018-07-14 19:11:11
【问题描述】:

我试图匹配关键字但不完全匹配,相关的东西,我使用带有 wilcard %% 的 sql LIKE 类似'%mens, shoe%',将匹配每个数据与男人、男鞋甚至两者,但问题是,如果用户使用像 '%men\'s, shoe%' 这样的撇号,这将只匹配有男鞋或有撇号的男鞋的记录,不会匹配男鞋或男鞋有没有办法我可以用撇号输入匹配记录而没有撇号谢谢任何帮助

我正在编辑我的问题并添加 SQL 语句的样子

 SELECT SQL_CALC_FOUND_ROWS p.product_id,p.title,p.price,p.unit_sold,p.slug,p.discount,p.free_shipping,free_return,
                p.profile_img,p.store_name,p.item_number,
                (
                    (-- Title score
                    if (title LIKE '%men\'s, shoe%',6,0) + if (title LIKE '%men\'s%',5,0) + if (title LIKE '%shoe%',5,0)
                    )+
                    (-- description
                    if (description LIKE '%men\'s, shoe%',5,0) + if (description LIKE '%men\'s%',4,0) + if (description LIKE '%shoe%',4,0) 
                    )+
                    (-- item number
                    if (item_number = 'men\'s, shoe',4,0) + if (item_number =  'men\'s',3,0) + if (item_number =  'shoe',3,0) 
                    )+
                    (-- category id
                    if (category_id = 'men\'s, shoe',4,0) + if (category_id = 'men\'s',3,0) + if (category_id = 'shoe',3,0) 
                    )

                ) as relevance
                FROM products p
                WHERE p.is_active = '1'

                HAVING relevance > 0
                ORDER BY  relevance DESC LIMIT 2,2

【问题讨论】:

  • 为了更好的文本搜索,您需要使用全文索引并使用MATCH .. AGAINST,但我仍然不相信 MySQL 适合复杂的文本搜索。我的建议是 Solr 或 Elasticsearch。
  • @Zamrony P. Juhara,感谢在线阅读了一些文档后,我想尝试一下 Elsaticsearch,但老实说,我无法完全理解它是如何工作的,我将数据保存在可以比较的索引中到数据库,如果我决定使用 ES,我的数据库中已经有一些数据,这是否意味着我无法在 ES 的帮助下在 mysql 数据库中搜索这些数据,如果可能的话,你能与我分享一个好的文档来阅读从了解如何实现这一点,谢谢
  • 您可以使用 Elasticsearch 作为搜索引擎,定期从 Mysql 导入数据以使用 logstash 同步数据。 qbox.io/blog/…
  • 虽然最好(好?)的结果只能通过复杂的文本索引或专门的引擎来实现,但改进可能来自 1.)在聚合上应用比较的所有数据列连接,2.)使用 @ 987654322@, 3.) 对测试数据进行规范化(不是 db 理论意义)(例如,全部小写、删除标点符号、删除语法标记)。

标签: mysql sql


【解决方案1】:

你的情况应该是这样的:

someColumn LIKE '%men''s%' or someColumn LIKE '%men\''s%' or someColumn LIKE '%shoe%'

其中someColumn 是您感兴趣的列名。它将匹配任何出现的情况,例如:men'smen\'s 等。

【讨论】:

  • 感谢您的回复,但在上述情况下 someColumn LIKE '%men%' 或 someColumn LIKE '%shoe%' 是一个撇号添加到搜索词中,如 '%men's%' 然后与标题或描述中包含男性的项目不匹配
【解决方案2】:

比较前去掉撇号:

(-- Title score
 (case when replace(title, '''', '') LIKE '%mens, shoe%' then 16
       when replace(title, '''', '') LIKE '%men%' then 5
       when replace(title, '''', '') LIKE '%shoe%' then 5
       else 0
  end) +
   . . . 

也就是说,您可能想研究全文搜索。这可能是实现您想要的更简单的方法。

【讨论】:

    猜你喜欢
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2022-06-12
    相关资源
    最近更新 更多