真的 有时 你不得不佩服人类

最近 因为 hometown 项目需要

然后开始查找 分词

然后 就佩服起来了人类

就佩服起来了这些厉害的大神

然后 就有了 jieba-api 这个项目

然后 我就遇到了查询中的问题了

因为这是一个 ucg 平台

所以 这个 搜索 显得格外的重要

然后 这个是可以选择位置 再加 内容的

所以 数据表就设计成了

user

1
2
id
nickname 昵称

content

1
2
3
4
5
6
7
8
id
title 标题
body 内容
province 省份
city 城市
area 区域
address 地址
user_id 用户ID

然后 搜索要可以通过

  • 用户昵称
  • 内容标题
  • 内容省份
  • 内容城市
  • 内容区域
  • 内容地址

这些条件 联合查询

按照 词性标注 可以完成一部分

用返回的 名词 去 内容标题
用返回的 地名 去 内容 省份 城市 区域 地址

如果没有返回 名词 地名 就去关联 用户表 的 昵称 查询

经过一系列的操作

就导致了

西安肉夹馍 可以在 位置为西安 搜索 标题含有肉夹馍 的数据

天旭流年 可以查出来 用户昵称为 天旭流年 发布的数据

然后 这时候 就有了一个

天旭流年 肉夹馍

按道理说 应该去查这个用户发布标题中含有 肉夹馍 的数据
可是这

看来我这样搜索是不对的

可我觉得又不能用一堆 if 判断

先记个 todo 上线后优化吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// 地名
$ns = $participle['ns'] ?? null;
if ($ns) {
$db->where(function ($query) use ($ns) {
foreach ([
'province',
'city',
'area',
'address',
] as $name) {
foreach ($ns as $value) {
$query->orWhere($name, 'like', "$value%");
}
}
});
}

// 普通名词
$n = $participle['n'] ?? null;
if ($n) {
$db->where(function ($query) use ($n) {
foreach ([
'title',
] as $name) {
foreach ($n as $value) {
$query->orWhere($name, 'like', "$value%");
}
}
});
}

/**
* 用户昵称
* 可能只查询用户昵称 所以 就
*/
$author_ids = User::search('nickname', $content)->pluck('id');
if ($author_ids) {
if ($ns || $n) {
$db->orWhereIn('author_id', $author_ids);
} else {
$db->whereIn('author_id', $author_ids);
}
}

下一个 应该是 推荐感悟