Giter Club home page Giter Club logo

simple's Introduction

Tip

新增:Rust Crate ! 感谢 xuxiaocheng0201

Downloads build codecov CodeFactor License: MIT

Simple tokenizer

simple 是一个支持中文和拼音的 sqlite3 fts5 拓展。它完整提供了 微信移动端的全文检索多音字问题解决方案 一文中的方案四,非常简单和高效地支持中文及拼音的搜索。

实现相关介绍:https://www.wangfenjin.com/posts/simple-tokenizer/

在此基础上,我们还支持通过 cppjieba 实现更精准的词组匹配,介绍文章见 https://www.wangfenjin.com/posts/simple-jieba-tokenizer/

用法

代码使用

命令行使用

首先需要确认你用到的 sqlite 版本支持 fts5 拓展,确认方法是:

select fts5(?1);

然后就可以使用了,具体的例子可以参考 example.sqlcpp

$ ./sqlite3
SQLite version 3.32.3 2020-06-18 14:00:33
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> .load libsimple
sqlite> CREATE VIRTUAL TABLE t1 USING fts5(text, tokenize = 'simple');
sqlite> INSERT INTO t1 VALUES ('中华人民共和国国歌');
sqlite> select simple_highlight(t1, 0, '[', ']') as text from t1 where text match simple_query('中华国歌');
[中华]人民共和[国国歌]
sqlite> select simple_highlight(t1, 0, '[', ']') as text from t1 where text match jieba_query('中华国歌');
[中华]人民共和国[国歌]
sqlite> select simple_highlight(t1, 0, '[', ']') as text from t1 where text match simple_query('中华人民共和国');
[中华人民共和国国]歌
sqlite> select simple_highlight(t1, 0, '[', ']') as text from t1 where text match jieba_query('中华人民共和国');
[中华人民共和国]国歌

功能

  1. simple tokenizer 支持中文和拼音的分词,并且可通过开关控制是否需要支持拼音
  2. simple_query() 函数实现自动组装 match query 的功能,用户不用学习 fts5 query 的语法
  3. simple_highlight() 实现连续高亮 match 的词汇,与 sqlite 自带的 highlight 类似,但是 simple_highlight 实现了连续 match 的词汇分到同一组的逻辑,理论上用户更需要这样
  4. simple_highlight_pos() 实现返回 match 的词汇位置,用户可以自行决定怎么使用
  5. simple_snippet() 实现截取 match 片段的功能,与 sqlite 自带的 snippet 功能类似,同样是增强连续 match 的词汇分到同一组的逻辑
  6. jieba_query() 实现jieba分词的效果,在索引不变的情况下,可以实现更精准的匹配。可以通过 -DSIMPLE_WITH_JIEBA=OFF 关掉结巴分词的功能 #35
  7. jieba_dict() 指定 dict 的目录,只需要调用一次,需要在调用 jieba_query() 之前指定。

开发

编译相关

使用支持 c++14 以上的编译器编译,直接在根目录 ./build-and-run 就会编译所有需要的文件并运行测试。编译输出见 output 目录

也可以手动 cmake:

mkdir build; cd build
cmake ..
make -j 12
make install

支持 iOS 编译:

./build-ios.sh

代码

  • src/entry 入口文件,注册 sqlite tokenizer 和函数
  • src/simple_tokenizer 分词器实现
  • src/simple_highlight 高亮函数,基于内置的高亮函数改的,让命中的相邻单词连续高亮
  • src/pinyin 中文转拼音以及拼音拆 query 的实现

TODO

  • 添加 CI/CD
  • 添加使用的例子,参见 cpp python3
  • 部分参数可配,比如拼音文件的路径(已经把文件打包到 so 中)
  • 减少依赖,减小 so 的大小
  • 给出性能数据:加载扩展时间2ms内;第一次使用拼音功能需要加载拼音文件,大概 500ms;第一次使用结巴分词功能需要加载结巴分词文件,大概 4s。

Star History

Star History Chart

simple's People

Contributors

boyan01 avatar ggymm avatar leiless avatar lihengdao666 avatar nmgwddj avatar pipi32167 avatar sagemik avatar vdbrcxby avatar wangfenjin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

simple's Issues

使用 node sqlite3 加载有日志打印

直接下载的 release v0.0.4,系统是 Ubuntu 20.04。

在 Node.js 中使用 sqlite3 模块加载扩展,有以下日志打印,请问有什么影响吗?或者怎样去除?

功能似乎是正常的。

profiling:/home/runner:Cannot create directory
profiling:/home/runner/work/simple/simple/build/src/CMakeFiles/simple.dir/entry.cc.gcda:Skip
profiling:/home/runner:Cannot create directory
profiling:/home/runner/work/simple/simple/build/src/CMakeFiles/simple.dir/simple_tokenizer.cc.gcda:Skip
profiling:/home/runner:Cannot create directory
profiling:/home/runner/work/simple/simple/build/src/CMakeFiles/simple.dir/simple_highlight.cc.gcda:Skip
profiling:/home/runner:Cannot create directory

编译相关

在 mac 和 centos 7 上编译总是出错,能否在文档中指出必要依赖,或者能不能发几个编译后的文件?

打扰~

sql问题

当我使用@"CREATE VIRTUAL TABLE IF NOT EXISTS 't_person' USING fts5(age INTEGER, name TEXT, id Blob PRIMARY KEY, tokenize='simple')"创建表的时候,提示Error calling sqlite3_step (1: unrecognized column option: INTEGER) SQLITE_ERROR
我必须把类型去掉才能创建成功,去掉类型保留主建也不可以

iOS上执行sqlite3_simple_init报错

rc = sqlite3_prepare(db, "SELECT fts5(?1)", -1, &pStmt, 0);
iOS平台上执行到这一句语句的时候报错,返回值SQLITE_ERROR,错误信息(wrong number of arguments to function fts5())

build 時,出現大量錯誤,須改 pinyin.h

计算机环境: visual studio 2019, windows 10,
但系统是繁体中文。

在build 时,出现 100多个错误,不是警告。

解决方法1:将 pinyin.h 檔之 tone_to_plain 中的怪字母,全改成一般英文字母,即可。当然其拼音的功能也就没了。

或者用
解决方法2:将 pinyin.h 重新存成 utf8 但有 bom ,(原档是utf8无bom)。

关于jieba分词的一点问题

您好,使用最新版带jieba分词功能的simple,有如下2点问题:

  1. 能否把dict目录再次融合进libsimple库中,只要一个动态库文件?
  2. jieba分词首次查询非常慢,第二次之后速度正常,是不是第一次加载dict目录下文件导致速度慢?能否优化一下呢

怎么编译出 iOS 可用的动态库

你好,我的项目使用 golang 做的。go 版本的 sqlite 并没有提供 sqlite3_auto_extension 这个静态库加载的函数,只提供了使用动态库加载的方法。我尝试了下并没有编译出动态库。想问下你这边有什么方案么?

make命令如何指定CPU架构

Android 的常用CPU 架构有 : armeabi / armeabi-v7a / arm64-v8a / x86 / x86_64 /MIPS / MIPS64
想要指定输出 armeabi / armeabi-v7a / arm64-v8a 这三种的SO库,要怎么弄
--- 不会弄 C C++

makefile 编译问题

我在Windows下的Linux子系统中测试的,出现如下问题:
1.编译sqlite3,打开fts5,使用了c函数log,所以需要链接math库

gcc -lm build/sqlite3.c build/shell.c -ldl -lpthread -o sqlite3-shell -DSQLITE_DEBUG -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_SELECTTRACE -DSQLITE_ENABLE_WHERETRACE
/usr/bin/ld: cannot find -lmath
collect2: error: ld returned 1 exit status
Makefile:52: recipe for target 'sqlite3-shell' failed
make: *** [sqlite3-shell] Error 1

所以makefile文件中LIB需要引入math,LIB = -ldl -lpthread -lm
2.测试sql文件中加载动态库需要改成.load ./libsimple,不然无法加载

关于特殊符字符报错

您好,使用 @ & , 等特殊符号检索时会报语法错误,sqlite3原始fts5 在match中使用特殊符号也会报错,并不是simple的原因,但是想问一下大神,在搜索时字符串包含@&这种特殊字符时,怎么处理呢?

如何实现顺序匹配

大佬辛苦!

比如原文“上午”,检索“午上”也能匹配上,请问有啥方法能做到保证顺序?因为匹配的索引本身是连续的,没法通过索引是否有间隔判断是否连续。

启动时间优化!

项目非常好用,但是是否可以优化下启动时间!

尝试在安卓开发里使用simple,高通855CPU,载入sqlite3_simple_init后sqlite3_open(":memory:", &db);需要4.928秒执行时间,无法实际使用。

在X86 intel 4.6G CPU, 启动需要2.566s。

希望可以给点提示,是否有办法优化启动时间。

没有libsimple依赖

.load libsimple 报错
macos环境下编译出sqlite3-shell后执行.load libsimple或.load libsimple.so 或.load libsimple.dylib报错
已经加入了LIB = -ldl -lpthread -lm

创建索引表问题

  1. 可扩展性高
    高可扩展性要求搜索表结构和业务解耦。SQLite FTS官网上的例子,都是以单索引表的方式,每一列对应业务的某一个属性,当对应业务发生变化,需要修改索引表的结构。为了解决业务变化而带来的表结构修改问题,微信把业务属性数字化,设计如下的表结构:
    http://www.52im.net/data/attachment/forum/201710/18/125902yj4jujjjonen5obo.jpeg
    IndexTable负责全文搜索的索引建立,它和逻辑无关,当搜索关键词时,只需要找到对应的DocId即可。MetaTable负责业务逻辑的过滤,通过Type和SubType来过滤对应业务的数据,最后输出BusItemId。

如上是《微信全文搜索优化之路》一文中针对索引表的介绍,我对索引有几个问题想请教一下:
1.业务表是正常的程序的数据表,还要再为了全文搜索再多建立一份索引表,是吗?我直接将我的业务数据表在创建的时候按虚表建立行吗?(例如create virtual table tablename using fts5(列名1,列名2,tokenize = 'simple'))
2.如果再多建立一份索引表,那是不是每一个业务表和对应的索引表的表字段是完全相同?
3.如果再多建立一份索引表,那数据库的大小是不是加倍了,尤其是把文件或图片影片存入数据库的情况(BLOB类型)?
4.原文中【为了解决业务变化而带来的表结构修改问题,微信把业务属性数字化】,这也是我想要的,能否帮助贴下原文中提到的【索引表-IndexTable】和【数据表-MetaTable】的建表语句?

非常非常感谢!!!

如何查询某个字段里面的指定内容

比如我的一个字段里面保存的是一个json字符串,{"content": "abcdefg", "text" : "abcdefg"},我要查询"content"字段里面包含了abcd(但是不包含"text"字段里面的abcd),这个该如何查询呢?
谢谢

如何在 electron 端使用呢

愁,接到了一个需求要在一个 electron 应用里搞全文搜索。
打算用 sqlite fts extension,但他对中文支持很差,想找个 tokenizer,但我不知道该怎么把你的这个 tokenizer 编译成 electron 能用的 sqlite 。
能提供点思路吗?

加入sqlcipher

你好 我想要把sqlcipher也打包进去,所以我模仿你下载cppjieba,在外层makelist里加入

OPTION(SIMPLE_WITH_SQLCIPHER "Option to build with sqlcipher" ON) if(SIMPLE_WITH_SQLCIPHER) #set(CMAKE_CXX_FLAGS SQLITE_HAS_CODEC) #set(SQLITE_TEMP_STORE=2) endif()

然后在src的makelist加入

` if(SIMPLE_WITH_SQLCIPHER)
#openssl
include(ExternalProject)
ExternalProject_Add(
openssl
PREFIX ${CMAKE_BINARY_DIR}/openssl
GIT_REPOSITORY https://github.com/openssl/openssl.git
CONFIGURE_COMMAND ""
BUILD_COMMAND cmake -E echo "Skipping build openssl."
INSTALL_COMMAND cmake -E echo "Skipping install openssl."
LOG_DOWNLOAD ON
)
ExternalProject_Get_Property(openssl source_dir)
#openssl

#include(ExternalProject)
ExternalProject_Add(
sqlcipher
PREFIX ${CMAKE_BINARY_DIR}/sqlcipher
GIT_REPOSITORY https://github.com/sqlcipher/sqlcipher.git
CONFIGURE_COMMAND ""
BUILD_COMMAND cmake -E echo "Skipping build sqlcipher."
INSTALL_COMMAND cmake -E echo "Skipping install sqlcipher."
LOG_DOWNLOAD ON
)
ExternalProject_Get_Property(sqlcipher source_dir)
endif()`

`if(SIMPLE_WITH_SQLCIPHER)
add_dependencies(simple openssl)

add_dependencies(simple sqlcipher)
include_directories(${SQLITE3_HEADERS_DIR} ${source_dir}/include ${source_dir}/deps)
target_include_directories(simple INTERFACE ${SQLITE3_HEADERS_DIR} ${source_dir}/include ${source_dir}/deps)

for tests only

add_custom_command(TARGET simple PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
${source_dir}/dict/ $<TARGET_FILE_DIR:simple>/../test/dict/)
INSTALL(DIRECTORY ${source_dir}/dict/ DESTINATION bin/dict FILES_MATCHING PATTERN "*.utf8")
else()
include_directories(${SQLITE3_HEADERS_DIR})
target_include_directories(simple INTERFACE ${SQLITE3_HEADERS_DIR})
endif()`

最后运行bulid-ios.sh 报错 CMake Error at src/cmake_install.cmake:78 (file): file INSTALL cannot find "/Users/xxx/Downloads/simple-master 2/build-ios/src/Release-iphoneos/libsimple.a": No such file or directory. Call Stack (most recent call first): cmake_install.cmake:62 (include) 不知道为什么?我在网上查的ExternalProject_Add这个函数后面几个参数不写也没什么,如果方便的可以帮我加一个sqlcipher吗?

windows 编译问题

我在windows上编译simple的时候遇到个问题,我的电脑连不上网;
我就手动下了个 release-1.10.0.zip文件在编译目录下;
但是 文件hash校验一直不过,还是会重新下载;
请教下作者,有什么办法可以规避么

插入数据时出现 sqlite3.DatabaseError: database disk image is malformed

问题:
我在使用simple分词器时,插入数据的时候会出现sqlite3.DatabaseError: database disk image is malformed报错,切换成其他分词器就不会出现。(数据库使用了external_content_tables。)
比较奇怪的一点是,插入报错后commit数据库,然后再重新打开,好像数据库也没有损坏。
感觉这个问题也许比较难debug?不过感觉挺影响使用体验的

环境:
windows 10 使用python的load_extension加载simple.dll
Python 3.9.2 (tags/v3.9.2:1a79785, Feb 19 2021, 13:44:55) [MSC v.1928 64 bit (AMD64)] on win32
https://github.com/wangfenjin/simple/releases/tag/v0.0.2

附件是我提取出来的较小的复现数据和建库插入的python脚本,在上一层目录放置解压好的win32的release里下载的simple分词器的dll即可运行。希望能在其他环境下稳定复现。

malformed.zip

build-and-run 运行报错

zyf@zyfdeiMac ~ % /Users/zyf/Desktop/Project/simple-master/build-and-run ; exit;
curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused
bash: -c: line 0: syntax error near unexpected token ;' bash: -c: line 0: ; bashmatic-install'
/Users/zyf/Desktop/Project/simple-master/build-and-run: line 24: /Users/zyf/.bashmatic/init.sh: No such file or directory
/Users/zyf/Desktop/Project/simple-master/build-and-run: line 32: h1.purple: command not found
/Users/zyf/Desktop/Project/simple-master/build-and-run: line 36: h1: command not found
/Users/zyf/Desktop/Project/simple-master/build-and-run: line 37: h1: command not found
/Users/zyf/Desktop/Project/simple-master/build-and-run: line 38: h1: command not found
/Users/zyf/Desktop/Project/simple-master/build-and-run: line 42: hl.subtle: command not found
/Users/zyf/Desktop/Project/simple-master/build-and-run: line 43: run: command not found
/Users/zyf/Desktop/Project/simple-master/build-and-run: line 52: hl.subtle: command not found
/Users/zyf/Desktop/Project/simple-master/build-and-run: line 53: run: command not found
/Users/zyf/Desktop/Project/simple-master/build-and-run: line 54: run: command not found
/Users/zyf/Desktop/Project/simple-master/build-and-run: line 55: run.set-next: command not found
/Users/zyf/Desktop/Project/simple-master/build-and-run: line 56: run: command not found
/Users/zyf/Desktop/Project/simple-master/build-and-run: line 57: run: command not found
/Users/zyf/Desktop/Project/simple-master/build-and-run: line 58: run: command not found
/Users/zyf/Desktop/Project/simple-master/build-and-run: line 62: hl.subtle: command not found
/Users/zyf/Desktop/Project/simple-master/build-and-run: line 63: run.set-all: command not found
/Users/zyf/Desktop/Project/simple-master/build-and-run: line 64: run: command not found
/Users/zyf/Desktop/Project/simple-master/build-and-run: line 65: run: command not found
/Users/zyf/Desktop/Project/simple-master/build-and-run: line 66: run: command not found
/Users/zyf/Desktop/Project/simple-master/build-and-run: line 71: error: command not found

[进程已完成]

匹配“中华人民共和国国歌”的国表现有点微妙

我有些想不太懂

drop table if exists t1
CREATE VIRTUAL TABLE t1 USING fts5(_id, text, tokenize = 'simple')
INSERT INTO t1 VALUES ("JJSUUAKAQQEWE", "中华人民共和国国歌")
select _id, simple_highlight(t1, 1, '[', ']') as text from t1 where text match simple_query('中华国歌');

# 查询结果: [ { _id: 'JJSUUAKAQQEWE', text: '[中华]人民共和[国国歌]' } ]

select _id, simple_highlight(t1, 1, '[', ']') as text from t1 where text match simple_query('中华人民共和国');
# 查询结果: [ { _id: 'JJSUUAKAQQEWE', text: '[中华人民共和国国]歌' } ]

为什么会匹配 “国国” 呢?

已经编译成功并生成libsimple.dylib,但如何在项目中使用

我已经编译成功并生成libsimple.dylib,并将库引入到项目里,然后我在项目的入口主函数里直接使用sqlite3原生函数建表
int sqlite3_exec(
sqlite3*, /* An open database /
"CREATE VIRTUAL TABLE t1 USING fts5(x, tokenize = 'simple')”, /
SQL to be evaluated /
int (callback)(void,int,char
*,char**), /* Callback function */
void , / 1st argument to callback */
char *errmsg / Error msg written here */
);
然后报错如下:"sqlite3_errmsg":"no such tokenizer: simple"

如何在项目中使用,还请指教。

如何动态的开启、关闭拼音?

CREATE VIRTUAL TABLE t2 USING fts5(x, tokenize = 'simple 0');

CREATE VIRTUAL TABLE t1 USING fts5(x, tokenize = 'simple 0');

如果要动态开启、关闭拼音,除了建两张表,还有推荐的方法么。

常见问题汇总(提 issue 前请先看这个)

  1. XX 语言的 ORM 加载报错?

这个库是一个标准的 SQLite FTS5 拓展,理论上与具体的语言无关。如果你依赖的 ORM 或者其他语言的封装有问题,请自行 debug。如果要问问题,请贴上完整的错误日志或者 SQL 语句。
examples 目录下有几种常见语言的例子,欢迎提 PR 加更多例子。

  1. 为什么不能指定主键?这个 SQL 为什么报错?

这个库是一个标准的 SQLite FTS5 拓展,语法需要满足 SQLite 标准的语法。加载这个扩展只是给 SQLite 加了几个函数,对 SQL 语法没有影响。
FTS5 的使用参考 https://www.sqlite.org/fts5.html

  1. XX 系统加载 Release 包失败?

我测试了 macOS 和 Linux 的输出,理论上都是没问题的。如果失败,请附上错误日志,一般自行 Google 也能找到原因,大部分情况都是系统版本太旧导致的。
Windows 的输出我没测试过,不保证能用,我也没有 Windows 电脑,所以对于 Windows 更好的支持欢迎各位提 PR。

  1. 匹配的好像不太对?

匹配的原理参考我在 Readme 里面放的两个博客链接。大部分都是因为 pinyin.txt 里面包含了太多的生僻字或者生僻读音引起的,如果不满足需求可以自行编辑 pinyin.txt 然后重新编译。

  1. 移动端怎么使用?

iOS 已知有人在使用了,Readme 里面也有例子。Android 理论上也可以,但是我这边还没有例子,欢迎 PR。

  1. 编译问题?

编译是 C++ 本身的老大难问题,几乎所有的 C++ 项目都会碰到各种各样的编译问题。但是这个库逻辑简单,依赖也不多,请大家自行解决,可以参考 GitHub Action 的例子。每个 PR 都要求跑过 CI,所以理论上不存在编译不过的情况。最简单的编译流程:

# 这会 Release 一个不包含 jieba 分词功能的扩展,支持拼音搜索。
mkdir build
cd build
cmake ..  -DCMAKE_BUILD_TYPE=Release -DCODE_COVERAGE=OFF -DBUILD_SHELL=OFF -DBUILD_TEST_EXAMPLE=OFF -DSIMPLE_WITH_JIEBA=OFF
make

已有数据表创建索引的问题

已经存在一个数据表data,里面有大量的数据,这个时候我再创建External Content Tables的fts表data_fts,data表里面以前的数据是没有索引存在在data_fts表里面的。根据(https://kimsereylam.com/sqlite/2020/03/06/full-text-search-with-sqlite.html)创建触发器也只是可以对以后的数据触发建索引,那么以前的数据我要建索引怎么办呢?因为以前的数据量比较大,再插入一次可能会比较耗时。

非常感谢

内容很多时,命中高亮问题

你好,我之前用的fts4的snippet方法高亮,现在换成simple_highlight后发现把所有内容都返回了,是否可以有截取部分高亮内容的功能?

iOS使用问题

你好 由于自己编译脚步不过,我使用你提供的变异好的文件,将src拖到iOS项目中,发现#include <cmrc/cmrc.hpp>这个文件找不到。请问怎么解决?

大佬辛苦了,向你提一点检索的问题和建议

-- 问题:
被检索字段内容很多时,查询性能明显下降。
同样的字段长度,对比fts4+icu分词器,simple分词明显要慢,具体没有测试慢多少。

-- 建议:
我认为是不是与使用拼音有关?
不论检索性能和拼音是否有关,我觉得simple应该提供一个可选参数,是否启用拼音检索
因为有些场景,比如字段内容是中英文混和的,使用拼音检索得到的结果有时候很离谱啊,把英文匹配上了。。

所以,我想请大佬加个flag,用于是否启用拼音检索。笔芯❤️

接入GRDB库的问题

大佬有没有接入GRDB库的例子,按照你这个流程无从下手,从demo下载编译文件也是一大堆错误,有点懵逼(C++小白)

关于simple_highlight函数的返回值问题

我创建虚拟表如下:
CREATE VIRTUAL TABLE t1 USING fts5(x,y, tokenize = "simple");
插入记录如下:
insert into t1 values ("周杰伦 Jay Chou:最美的不是下雨天,是曾与你躲过雨的屋檐","我是y列")
然后进行查询如下:
select simple_highlight(t1, 0, '[', ']') from t1 where t1 match simple_query('y列');
返回的是"周杰伦 Jay Chou:最美的不是下雨天,是曾与你躲过雨的屋檐",这是为什么呢,而我想到的是返回“我是[y列]”,还请大神帮助看看

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.