精华内容
下载资源
问答
  • 处理前 ``` 处理前[{"Group":1,"Groupheader":"质量管理","Leftimg":"","Left":"","Min":"","Right":"","Rightimg":""}, {"Group":1,"Groupheader":...求怎么写一个方法让json数据按FirstLetter分类,写具体代码
  • mySQL怎么批量替换查询结果中的字段值。 不仅仅是简单替换某字段的,是替换查询结果的字段值。 比如会员表,在mySQL,我先按照性别、有头像、已通过邮箱验证检索出一部分...这个操作语句怎么写?拜谢各位老师。
  • 然后我们再来看一下,我们添加新的字段映射,前面我们已经在my-index这个索引下,添加了一些映射了, ...然后我们上,properties,以及要添加的字段映射的名字employee-id,然后这个字段的类型是keyword,表示他可以..

    然后我们再来看一下,我们添加新的字段映射,前面我们已经在my-index这个索引下,添加了一些映射了,

    然后我们,怎么样再那些基础上再添加映射呢?

    我们可以直接写在原来的基础上嘛?

    不可以,报错了对吧.

    我们添加新的字段映射,需要用上面的格式

    我们使用

    PUT /my_index/_mapping可以看到就是在索引后面加上_mapping就可以了

    然后我们写上,properties,以及要添加的字段映射的名字employee-id,然后这个字段的类型是keyword,表示他可以

    允许他精确匹配,要注意,这里我们,还添加了一个index是false.

    是什么意思呢?

    这个index的意思是,如果指定了是false,就表明这个字段,不能被索引,也就是说,employee-id这个字段

    不会被查询出来.

     

    注意所有的字段默认的这个index的值都是true的.

    然后我们去看一下文档,中有个mapping parameters 映射字段.

    点开以后,可以看到有很多的,对字段描述的熟悉可以用,比如有format,设置字段的格式

    然后index设置字段的索引,我点击去看

    可以看到,解释说,默认是true,如果是false,那么这个字段就不能被检索到了.

    然后我们可以

    PUT /my_index/_mapping

    可以去试试,上面这样写上,然后点击执行,就可以看到,这样一个新的映射字段就添加好了.

     

    技术交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152
    开通了个人技术微信公众号:credream,有需要的朋友可以添加相互学习

     

     

     

    展开全文
  • 比如我有一个字符串123456,我想查找到所有的某字段以这个字符串开头但是后面不含“/”的数据,现在如果直接在参数中像图那样写123456可以查到包含123456这个... - - 这个正则应该怎么写呢,不知道怎么表达不包含的...
  • SSM mybatis自动生成的xxxwithBOLBs怎么检索其中的text大字段 最近加入的学校实验室分配了一个周报系统的任务。前搭框架,基本的逻辑实现都还挺顺利的,但在从数据库中检索text大字段的时候遇到了一些问题,卡了...

    SSM mybatis自动生成的xxxwithBOLBs怎么检索其中的text大字段

    最近加入的学校实验室分配了一个写周报系统的任务。前搭框架,基本的逻辑实现都还挺顺利的,但在从数据库中检索text大字段的时候遇到了一些问题,卡了差不多一周的时间(太菜了)。原因是mybatis自动生成时如果数据库表中有text大字段,那么这个数据库表就会生成两个entity对象。

    一个是该表名字xxx,里面放的是非text属性的set,get,这里以Report为例,其中mcomment和scomment为text大字段

    public class Report {
        private Integer rid;
    
        private String filename;
    
        private String username;
    
        private Integer uid;
    
        public Report(Integer rid, String filename, String username, Integer uid) {
            this.rid = rid;
            this.filename = filename;
            this.username = username;
            this.uid = uid;
        }
    
        public Report() {
            super();
        }
    
        public Integer getRid() {
            return rid;
        }
    
        public void setRid(Integer rid) {
            this.rid = rid;
        }
    
        public String getFilename() {
            return filename;
        }
    
        public void setFilename(String filename) {
            this.filename = filename == null ? null : filename.trim();
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username == null ? null : username.trim();
        }
    
        public Integer getUid() {
            return uid;
        }
    
        public void setUid(Integer uid) {
            this.uid = uid;
        }
    }
    

    另外一个是xxxwithBLOBs里面放的是text属性的get set

    public class ReportWithBLOBs extends Report {
        private String mcomment;
    
        private String scomment;
    
        public ReportWithBLOBs(Integer rid, String filename, String username, Integer uid, String mcomment, String scomment) {
            super(rid, filename, username, uid);
            this.mcomment = mcomment;
            this.scomment = scomment;
        }
    
        public ReportWithBLOBs() {
            super();
        }
    
        public String getMcomment() {
            return mcomment;
        }
    
        public void setMcomment(String mcomment) {
            this.mcomment = mcomment == null ? null : mcomment.trim();
        }
    
        public String getScomment() {
            return scomment;
        }
    
        public void setScomment(String scomment) {
            this.scomment = scomment == null ? null : scomment.trim();
        }
    }
    

    然后使用selectByExampleWithBLOBs,这个是大字段专用。但自动生成的函数返回值为xxx,需要自己改成xxxwithBLOBs

    xxxmapper.java

    List<ReportWithBLOBs> selectByExampleWithBLOBs(ReportExample example);
    

    xxxserviceImpl

    public ReportWithBLOBs getById(Integer id) {
    		ReportExample example = new ReportExample();
    		Criteria criteria = example.createCriteria();
    		criteria.andRidEqualTo(id);
    		List<ReportWithBLOBs> list = reportMapper.selectByExampleWithBLOBs(example);
    		return list.get(0);
    	}
    

    xxxController

    @RequestMapping("checkComment")
    	public ModelAndView checkComment(String id) {
    		ReportWithBLOBs report=reportService.getById(new Integer(id));
    		String filename=report.getFilename();
    		String mcomment=report.getMcomment();
    		String scomment=report.getScomment();
    		ModelAndView mav=new ModelAndView("student/checkComment");
    		mav.addObject("filename",filename);
    		mav.addObject("mcomment",mcomment);
    		mav.addObject("scomment",scomment);
    		return mav;
    	}
    

    显示界面

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>My JSP 'checkComment.jsp' starting page</title>
        
    	<meta http-equiv="pragma" content="no-cache">
    	<meta http-equiv="cache-control" content="no-cache">
    	<meta http-equiv="expires" content="0">    
    	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    	<meta http-equiv="description" content="This is my page">
    	<!--
    	<link rel="stylesheet" type="text/css" href="styles.css">
    	-->
    
      </head>
      
      <body>
        文件名字:${requestScope.filename}<br>
      主管老师评价:${requestScope.mcomment}<br>
      小导师评价:${requestScope.scomment}<br>
      </body>
    </html>
    

    截图
    成功截图

    展开全文
  • 这一课介绍什么是计算字段怎么用,以及引用。 7.1 计算字段 存储到数据库表中的数据不一定就是应用程序所需要的的样子,可以针对不同实例了解一下可能会用到的场景: □ 需要显示公司名,同时还需要显示公司的...

    这一课介绍什么是计算字段,怎么用,以及引用。

    目录

    7.1 计算字段

    7.2 拼接字段

    7.3 执行算术计算


    7.1 计算字段

    存储到数据库表中的数据不一定就是应用程序所需要的的样子,可以针对不同实例了解一下可能会用到的场景:

    □ 需要显示公司名,同时还需要显示公司的地址,但这两个信息存储在不同的表列中。

    □ 城市、州和邮政编码存储在不同的列中(应该这样),但邮件标签打印程序需要把它们作为一个有恰当格式的字段检索出来。

    □ 列数据是大小写混合的,但报表程序需要把所有数据按大写表示出来。

    □ 物品订单表存储物品的价格和数量,不存储每个物品的总价格(用价格乘以数量即可)。但为打印发票,需要物品的总价格。

    □ 需要根据表数据进行诸如总数、平均数的计算。

    所以我们需要从数据库中检索出转换、计算或格式化过的数据,而不仅仅只是检索出数据,放到程序中去计算或者格式化,至于原因,前面博文中提到了,消耗带宽破坏程序简洁。更为重要的是,在数据库中完成这些操作,远远快于在客户端中完成。

    那么就需要引入这一课中的重要知识:计算字段。值得注意的是,计算字段并不实际存在表中,是在运行中SELECT语句创建的,理解成用完销毁。

    字段(field)

    基本上与列(column)的意思相同,经常互换使用,不过数据库列一般称为列,而术语字段通常与计算字段一起使用。

    这里提到,从数据库角度来看,实际表列 与 计算字段 是明显不同的,但从客户端来看,也就是发起数据请求的应用程序来看,计算字段得到的数据和其他列数据,返回方式相同。

    7.2 拼接字段

    拼接(concatenate)

    将值联结到一起(将一个值附加到另一个值)构成单个值。

    使用计算字段,需要用实例说明,比如创建两列组成的标题生成一个供应商报表,需要在格式化的名称(位置)中列出供应商的位置。

    解决办法是把两个列拼接起来。在SQL中的SELECT语句中,可使用一个特殊的操作符来拼接两个列。根据你所使用的DBMS,此操作符可用加号(+)或两个竖杠(||)表示。在MySQL中,必须使用特殊的函数。这里查到相关用法,进行引用MySql-字符串拼接函数_东京易冷-CSDN

    使用拼接符号+得到的结果并不如预料那样,上下使用的分别是中英文括号。

    SELECT Concat(vend_name,'(',vend_country,')')
    FROM Vendors
    ORDER BY vend_name;

    使用concat函数连接需要检索的拼接列。

    上述SELECT语句返回的输出,结合成一个计算字段的两个列没有用空格填充。

    许多数据库(不是所有)保存填充为列宽的文本值,而实际上需要的结果不需要这些空格。

    为正确返回格式化的数据,必须去掉这些空格。这可以使用SQL的RTRIM()函数来完成。

    大多数DBMS都支持RTRIM()、LTRIM()(去掉字符串左边的空格)以及TRIM()(去掉字符串左右两边的空格)。在MySQL中,显然不支持这个函数。

    别名(alias)是一个字段或值的替换名。用AS关键字赋予。

    SELECT Concat(vend_name,'(',vend_country,')') AS vend_title  FROM Vendors ORDER BY vend_name;

    别名问题:常见的用途包括在实际的表列名包含不合法的字符(如空格)时重新命名它,在原来的名字含混或容易误解时扩充它。

    别名命名问题:既可以是一个单词,也可以是一个字符串。如果是后者,字符串应该括在引号中。虽然这种做法是合法的,但不建议这么去做。多单词的名字可读性高,不过会给客户端应用带来各种问题。因此,别名最常见的使用是将多个单词的列名重命名为一个单词的名字

    导出列别名有时也称为导出列(derived column),不管怎么叫,它们所代表的是相同的东西。

    7.3 执行算术计算

    计算字段的另一常见用途是对检索出的数据进行算术计算,可以看看有哪些应用场景。

    Orders表包含收到的所有订单,OrderItems表包含每个订单中的各项物品。假如我们需要检索订单号20008中的所有物品:

     SELECT prod_id,quantity,item_price FROM OrderItems WHERE order_num = 20008;

    item_price列包含订单中每项物品的单价。如果我们来汇总物品的价格(单价乘以订购数量):

    SELECT prod_id,quantity,item_price,quantity*item_price AS expanded_price FROM OrderItems WHERE order_num = 20008;

    可以看到,expanded_price列就是我们用检索到的单价和订购数量之积。

    以下是基本算术操作符,圆括号作为优先级顺序的标记。

    测试问题:SELECT语句为测试、检验函数和计算提供了很好的方法。虽然SELECT通常用于从表中检索数据,但是省略了FROM子句后就是简单地访问和处理表达式,可以根据需要使用SELECT语句进行检验。

    例如SELECT 3 * 2;将返回6, SELECT Trim(' abc ');将返回abc, SELECT Now();使用Now()函数返回当前日期和时间。

    这节课就结束了,依旧是“刻意练习,每日精进”~

     

     

     

    展开全文
  • 代码怎么写的? 2.这个BTree是在内存还是在磁盘里;内存是不是有一部分BTree的结构? 3.联合索引BTree是怎么存储的,多字段查询是怎么检索的? 4.为什么用BTree结构,而不用其他存储结构 比如红黑树? ...

    本节专注于讨论BTree的结构。 其他如BTree裂变、查找、插入流程、undolog、redolog各种执行顺序等后面讨论。

    还是先抛问题。

    1.数据结构是什么?代码怎么写的?

    2.这个BTree是在内存还是在磁盘里;内存是不是有一部分BTree的结构?

    3.联合索引BTree是怎么存储的,多字段查询是怎么检索的?

    4.为什么用BTree结构,而不用其他存储结构 比如红黑树?

     

    1.简要介绍背景知识

    借用一副常见的图,mysql一次查询会经过这么多步骤,BTree位于存储引擎层,是Innodb特有的结构。

    以此表结构为例。

    create table t1 (

    `id` int AUTO_INCREMENT;

    `a` varchar(255),

    `b` varchar(255),

    `c` int

    primary key (`id`),

    key `idx_a_b_c` (`a`,`b`,`c`) 

    ) ENGINE=InnoDB;

    select * from t1 where id = 55;  整个sql语句经过各种流程后,到达存储引擎层 就会被翻译为一个数据结构 [table=t1, id=55]

    2.通过ibdata文件分析BTree结构

    我们先不抛概念,直接看结构。当前表里有两条记录,利用mysql分析神器(https://github.com/jeremycole/innodb_ruby/wiki 后续文章讲解怎么使用)查看文件内容。

    这个表有两个索引 聚簇索引(Index 489)和普通索引(Index 490)数据。

    我们看聚簇索引存了什么东西:说几个重点结构,1.page header里的level=0 说明是叶子节点 2. records这个结构,几个关键字段 type = clustered 代表是数据行、 offset、next;可以看出是链表方式组织的结构。

    我们再插入500条数据。

    可以看出Page增多,BTree不再是一层。对第一个page做分析,可看到records type = node_pointer,说明这个数据行是指针,key字段可以看到是id = 1 child_page_number 说明下一层page号是5。

    看到这里 大家结合自身对BTree的了解,是不是已经能体会到真正的结构了 下面开始介绍各种概念。

    3.BTree的数据结构 
     

    如图,BTree核心就是Page和Record,Page里包含一个Records链表,Page通过指针的方式组织成一个BTree。而真正查找要进行一次PageNum查找和一次Record链表查找。

    举个例子,比如要查 id = 55;根据结构先找到level =1 (只会有一个page节点)的page,然后遍历record找到第一个小于等于5的record,它的child_page_num指针会告诉下一层page页,找到后再遍历record链表 即可找到记录。

     数据结构

    1.Page 

    就是由一个字节数组组成。

    Fil Header

        Page是双向链表,主要包含两个指针 FIL_PAGE_PREV IL_PAGE_NEXT,用来构建这个双向链表。

    Page Header

        存由PAGE_LEVEL 树的层级。 0 is leaf node

    Infimum + Supremum Records

        一个Page有多个Record,这两个用于保持最小和最大Record(按照index排序) 方便查找

    User Records 用户记录

        一个Page最大有65535 16K数据,也就是理论上一个rec就16k(实际远远小于16k),rec也是一个链表,且按照index逻辑有序,page的rec是按照物理顺序存储的。主键作为key,一般order by 就直接按照链表顺序查出来了。

    Page Directory

        记录key和record的映射,二分查找。因为BTree是针对Page维度的,最后需要key找到record。

     

    4.BTree代码阅读

    通篇搜索mysql代码,也没有找到一个struct表述page的数据结构。 这是因为,mysql仅用一个指针来初始化,从文件系统里获取连续一段空间(映射到block_t) 然后用指针初始化这个空间就形成了page结构,然后通过指针来构造树和链表。见上图

    涉及数据结构

    buf_block_t 一个文件块,取其中的一部分构成page

    page_t = typedef byte page_t  本质就是一个字节指针。

    涉及代码文件

    buf0buf.h

    btr0btr.cc

    涉及函数

    btr_create  //Create the root node for a new index tree. 

        page = page_create(block, mtr, dict_table_is_comp(index->table),page_create_type);

        page_create_low(buf_block_t *block, ulint comp,page_type_t page_type) 初始化一个Page页包括File Header Page Header Infi Supre Records

    当第一次插入的时候,会从Page里找,发现没有节点,创建一个record加入到(rec_t)User Records里,你可以认为就是再连续数组后面追加了一些字节。

    至此,BTree的数据结构就介绍完了,还有很多其他字段,不展开讲了。 

    5.普通索引怎么构建BTree

    每个普通索引都有一个BTree,也就是mysql会开辟一块空间存这些Page,leaf page是聚簇索引的key。

    select * from t1 where a = "x1" and b = "y1" 究竟会怎么查找呢?

    首先,普通索引是key是一个元组(key1的val|key2的val|key3的val),比如记录1 a = "x" b = "y" c = "z"  映射成普通索引record的value 就是[x,y,z]这个内容。顺序是按照a b c顺序存储, 查找的时候一个字段一个字段,根据字符串ASCII码比较。

    又插入记录 (x,y2,z) (x1,y,z) (x1,a,z) (x1,y1,z) (x1,y1,a)

    最终顺序为: (x,y,z) (x,y2,z) (x1,a,z) (x1,y,z) (x1,y1,a) (x1,y1,z)

    查找a = "x1" and b = "y1" 流程如下:

    pageNumb1  a == x1 and b > y 则选择pageNum3

    (x1,y1) > (x1,y) 最后输出 (x1,y1,z) (x1,y1,a)

     

    小结:

    回答开头三个问题

    1.真正的数据结构是什么?也就是代码怎么写的?

    Page+Records 树和链表的数据结构

    2.这个BTree是在内存还是在磁盘里;内存是不是有一部分BTree的结构

    可以看到都存在ibdata文件里;内存里不会有BTree结构 但是会有一些缓存(后面专门讲解)

    3.联合索引BTree是怎么存储的,多字段查询是怎么检索的

    record的key对应多字段的元组,查找时按照字段比较 找结果。

    4.为什么用BTree结构,而不用其他存储结构 比如红黑树? 

    磁盘存储,顺序读写,一次IO操作系统一般会预取后几页。B+Tree层级少,同层Page是顺序存储的,查找数据时磁盘寻道时间会少。红黑树相邻节点物理上不相邻,深度很深,每一层都进行一次寻道,IO多。

     

    磁盘有扇区和磁道(类似于X Y轴),顺序查找不用寻道时间,随机查找需要大量转变扇区和磁道

    一个物理地址 = 扇区+磁道

    寻道时间: 变动磁头找到磁道

    旋转时间:旋转磁盘找到扇区

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 百度了很久都没有找到关于使用 CsvWriter 类时对字符串内容怎么解决转义的情况.当然也可能是检索的标题不太对吧. 故自己重新出了一个小的使用教程对这个问题进行解决 A. 需求描述: 需要对文件中的内容解析并且...
  • 但是后面没有“/”的数据】,这应该就得用正则表达式来匹配了,所以请教大神,这个正则应该怎么写(确实不知道怎么表达不包含这个含义),还有正则应该怎么当参数放进去使用?谢谢。~![图片说明]...
  • C# 开发和使用中的23个技巧 1.怎样定制VC#DataGrid列标题?...2.检索某个字段为空的所有记录的条件语句怎么写? 3.如何在c# Winform应用中接收回车键输入? 4.比如Oracle中的NUMBER(15),在Sql Server中应是什么?
  • DataGridTextBoxColumn(); dgcs.MappingName = "title_id"; dgcs.HeaderText = "标题ID"; dgts.GridColumnStyles.Add(dgcs); 。。。 dataGrid1.TableStyles.Add(dgts)...检索某个字段为空的所有记录的条件语句怎么写
  • 在同一张表中,怎么查询两个字段的值是否是一一对应关系,检索两个字段,其中一个不变,如果是一堆多的话,就在不变的id这里加以,一对一的,就显示1,否则相加, 相当于 id name 1 1 2 4(这里说明有四个名字的...
  • .net技巧收集

    2007-12-12 09:41:00
    1.检索某个字段为空的所有记录的条件语句怎么写? ...where col_name is null 2.sql server的应用like语句的存储过程怎样写? select * from mytable where haoma like ‘%’ + @hao + ‘%’ 3. ...
  • 那么,现在假设给出某一个权限编号,要去检索出包含这个权限的所有用户记录集合,该怎么这个sql语句呢?分析:这时就需要在逗号分隔的多个权限编号字段中去匹配给出的这个权限编号。如果使用like去做,一则效率...
  • 问题1:oracle数据库怎么找出表中某字段的那些记录有乱码?用sql语句或其他方法解决能行吗? 回答: 没有自带的方法, 不过你自己可以个存储过程,方法之类的。 1,用游标检索。 2,检查每个字段是数字, 字母...
  • 在移动开发中,当做到上拉加载,下来刷新的...答:打开iscroll.js文件,ctrl+f检索bar字段,找到 这段代码,把所有的bar的样式全部注释,滚动条就消失了,这样一来,可以让手机端的页面看起来更加的舒服,当然,iscro
  • 今天杂记

    2005-02-21 10:53:00
    1、问题:对一个表,有... 2、感想在单元测试的时候,如果对数据库进行检索或插入,最好用select * 及不带字段名的insert into tablename values(连续插入几个值,可以用insert into tablenameselect aaaa....unions
  • 经测试发现原因是:在强制初始化时,hibernate竟然拿a表中的bno同b表中的id字段关联检索,结果当然是找不着对应的记录了,我尝试着把b表中的那条记录的id改成11,反倒是关联成功了。 我想知道在hibernate中,对于...
  • SQL语句是大小不敏感的 1、简单的Insert语句。向数据库中插入数据。Into后的列名和values一一对应,字符串用单引号 Insert Into T_Person(FName,FAge) values('Jim',25) Insert into T_Person(FName) values('...
  • SQL语法大全

    2014-03-30 11:00:11
    sql="select * from 数据表 where 字段名 like \'%字段值%\' order by 字段名 [desc]" sql="select top 10 * from 数据表 where 字段名 order by 字段名 [desc]" sql="select * from 数据表 where 字段名 in (\'值...
  • sql总结.doc

    2019-08-27 22:08:51
    1、索引 ·什么是索引 ·索引的基本原理 ·索引的基本写法 ·索引的分类 ... 比如你判断一个班上的同学数学成绩怎么样,你就可能用游标,先把全部的成绩查询到游标中,之后再循环一条条进行判断处理。
  • 怎么查的? 数据的准备如下: [sql] view plain copy create table STUDENT( STU_ID int primary KEY, STU_NAME char(10) not null, STU_AGE smallint unsigned not null, STU_SEX char(2) not null ); ...
  • 用户只需指出“做什么”,而不需指出“怎么做”,对数 据存取路径的选择以及 语句功能的实现均由系统自动完成,与用户编制的应用程序与 具体的机器及关系 的实现细节无关,从而方便了用户,提高了应用程序的开发效率,...
  • 禅道是第一款国产的开源项目管理软件。它集产品管理、项目管理、质量管理、文档管理...699 计划关联需求时候的搜索,所属计划怎么把所有的都列出来了? 696 测试-bug 已延期标签搜索条件和列表页面延期提醒条件不一致
  • 一个好用的数据库类

    2008-05-14 08:36:06
    <br>三、实例练习 <br>下面就通过上面的例子一起来看一下这个类到底怎么样,为了方便,我建了一个简单的access数据库test.mdb,在这个数据库中也只有一张表emp,它有三个字段。在下面的工程的InitInstance ()...
  • golang 面试题:reflect(反射包)如何获取字段 tag?为什么 json 包不能导出私有变量的 tag? 协程和线程的差别 垃圾回收的过程是怎么样的? 什么是屏障、混合屏障,如何实现? 开源库里会有一些类似下面这种...
  • 10.1 数据库名、表名大小问题 39 10.2 使用外键需注意的地方 41 第二篇 优化篇 45 第11章 SQL优化 45 11.1 优化SQL的一般步骤 45 11.1.1 通过show status和应用特点了解各种SQL的执行频率 45 11.1.2 定位执行效率...

空空如也

空空如也

1 2
收藏数 37
精华内容 14
关键字:

检索字段怎么写