sphinx多字段查询

问题提出:

在购物或者是视频网站中,经常会看到聚类搜索,什么按照城市、类别、用途、爱好之类,这种可以是多选


问题解决:

1.mysql的where查询, 缺点:对于分裂的库表无能为力

2.sphinx


sphinx可以实现多字段查询,而且还可以通过属性进行排序、过滤等操作。(请注意,索引是不可以全文搜索的,因而要做全文搜索的字段一定不能作为索引

具体可见sphinx文档:


************************************************************************************************************************************************************************

3.2. 属性

属性是附加在每个文档上的额外的信息(值),可以在搜索的时候用于过滤和排序。

搜索结果通常不仅仅是进行文档的匹配和相关度的排序,经常还需要根据其他与文档相关联的值,对结果进行额外的处理。例如,用户可能需要对新闻检索结果依次按日期和相关度排序,检索特定价格范围内的产品,检索某些特定用户的blog日志,或者将检索结果按月分组。为了高效地完成上述工作,Sphinx允许给文档附加一些额外的属性,并把这些值存储在全文索引中,以便在对全文匹配结果进行过滤、排序或分组时使用。

属性与字段不同,不会被全文索引。他们仅仅是被存储在索引中,属性进行全文检索式不可能的。如果要对属性进行全文检索,系统将会返回一个错误。

例如,如果column被设置为属性,就不能使用扩展表达式@column 1去匹配column为1的文档;如果数字字段按照普通的方式被索引,那么就可以这样来匹配。

属性可用于过滤,或者限制返回的数据,以及排序或者 结果分组; 也有可能是完全基于属性排序的结果, 而没有任何搜索相关功能的参与. 此外, 属性直接从搜索服务程序返回信息, 而被索引的文本内容则没有返回.

论坛帖子表是一个很好的例子。假设只有帖子的标题和内容这两个字段需要全文检索,但是有时检索结果需要被限制在某个特定的作者的帖子或者属于某个子论坛的帖子中(也就是说,只检索在SQL表的author_id和forum_id这两个列上有特定值的那些行),或者需要按post_date列对匹配的结果排序,或者根据post_date列对帖子按月份分组,并对每组中的帖子计数。

为实现这些功能,可以将上述各列(除了标题和内容列)作为属性做索引,之后即可使用API调用来设置过滤、排序和分组。以下是一个例子:

示例: sphinx.conf 片段:
...
sql_query = SELECT id, title, content, \
        author_id, forum_id, post_date FROM my_forum_posts
sql_attr_uint = author_id
sql_attr_uint = forum_id
sql_attr_timestamp = post_date
...
示例: 应用程序代码 (PHP):
// only search posts by author whose ID is 123
$cl->SetFilter ( "author_id", array ( 123 ) );

// only search posts in sub-forums 1, 3 and 7
$cl->SetFilter ( "forum_id", array ( 1,3,7 ) );

// sort found posts by posting date in descending order
$cl->SetSortMode ( SPH_SORT_ATTR_DESC, "post_date" );



### 查询多个模糊字段的语句 在 MySQL 中,当需要对多个字段进行模糊查询时,可以使用 `LIKE` 结合 `OR` 或 `AND` 运算符来实现。虽然 `LIKE` 本身只能匹配单个字段中的模式,但通过组合多个 `LIKE` 条件,可以实现对多个字段的模糊匹配。 例如,假设有一个名为 `articles` 的表,其中包含 `title` 和 `content` 字段,若需查询标题或内容中包含“建设”或“统计”的记录,可以使用以下语句: ```sql SELECT * FROM articles WHERE title LIKE '%建设%' OR content LIKE '%建设%' OR title LIKE '%统计%' OR content LIKE '%统计%'; ``` 该语句将返回所有在 `title` 或 `content` 字段中包含“建设”或“统计”的记录[^1]。 此外,也可以结合括号来增强可读性和逻辑清晰度,例如: ```sql SELECT * FROM articles WHERE (title LIKE '%建设%' OR content LIKE '%建设%') OR (title LIKE '%统计%' OR content LIKE '%统计%'); ``` 这种写法更适用于复杂的多条件模糊匹配场景,有助于避免逻辑错误。 --- ### 多字段模糊查询的优化建议 由于 `LIKE` 在以通配符 `%` 开头的情况下无法有效利用索引,因此对于大型数据集来说,频繁使用此类查询可能会导致性能问题。为提升效率,可以考虑以下方法: - **全文索引(FULLTEXT)**:MySQL 支持在文本字段上创建全文索引,通过 `MATCH ... AGAINST` 语法实现更高效的模糊搜索。 - **分词与搜索引擎集成**:如使用 ElasticsearchSphinx 等外部搜索引擎进行复杂文本检索,并将结果与 MySQL 数据库联动。 --- ### 示例:结合角色权限的动态查询 在某些业务场景中,可能需要根据用户角色动态调整查询条件。例如,管理员用户应能查看所有记录,而非管理员用户仅能查看与其类别相关的记录。此时可以通过 `CASE` 表达式或 `IF` 函数构建动态查询条件: ```sql SELECT * FROM articles WHERE (user_role = 'admin') OR (category = 'statistics' AND user_role != 'admin') OR (category = 'construction' AND user_role != 'admin'); ``` 该语句表示:如果用户是管理员,则返回所有记录;否则只返回与其权限对应的“统计”或“建设”类别的记录[^2]。 --- ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值