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

最近 因为 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);
}
}

下一个 应该是 推荐感悟