Solr之查询页面,索引,SolrJ

news2024/10/5 15:30:39

文章目录

  • 1 Solr查询
    • 1.1 查询页面
      • 1.1.1 基本查询
      • 1.1.2 Solr检索运算符
      • 1.1.3 高亮
      • 1.1.4 分组
        • 1.1.4.1 分组(Field Facet)
        • 1.1.4.2 分组(Date Facet)
    • 1.2 创建索引文件
      • 1.2.1 使用Post上传文件
        • 1.2.1.1 Linux下使用
          • 1.2.1.1.1 索引XML
          • 1.2.1.1.2 索引 CSV
          • 1.2.1.1.3 索引 JSON
          • 1.2.1.1.4 索引丰富的文档(PDF、Word、HTML等)
          • 1.2.1.1.5 索引到受密码保护的 Solr(基本身份验证)
        • 1.2.1.2 Windows下使用
          • 1.2.1.2.1 SimplePostTool
      • 1.2.2 Dataimport页面报错
        • 1.2.2.1 修改solrconfig.xml
        • 1.2.2.2 data-config.xml
        • 1.2.2.3 迁移jar包
  • 2 第三方工具 SolrJ
    • 2.1 pom.xml
    • 2.2 模板数据和实体
    • 2.3 实体工具类
    • 2.4 读取工具类
    • 2.5 查询分析
      • 2.5.1 分页查询
      • 2.5.2 高亮查询
    • 2.6 修改更新删除索引文件

1 Solr查询

1.1 查询页面

1.1.1 基本查询

参数意义
q查询的关键字,此参数最为重要,例如,q=id:1,默认为q=:,
fl指定返回哪些字段,用逗号或空格分隔,注意:字段区分大小写,例如,fl= id,title,sort
start返回结果的第几条记录开始,一般分页用,默认0开始
rows指定返回结果最多有多少条记录,默认值为 10,配合start实现分页
sort排序方式,例如id desc 表示按照 “id” 降序
wt (writer type)指定输出格式,有 xml, json, php等
fq(filter query)过虑查询,提供一个可选的筛选器查询。返回在q查询符合结果中同时符合的fq条件的查询结果,例如:q=id:1&fq=sort:[1 TO 5],找关键字id为1 的,并且sort是1到5之间的
df默认的查询字段,一般默认指定。
qt (query type)指定那个类型来处理查询请求,一般不用指定,默认是standard。
indent返回的结果是否缩进,默认关闭,用 indent=true
version查询语法的版本,建议不使用它,由服务器指定默认值。

1.1.2 Solr检索运算符

符号意义
:指定字段查指定值,如返回所有值:
?表示单个任意字符的通配
*表示多个任意字符的通配(不能在检索的项开始使用*或者?符号)
~表示模糊检索,如检索拼写类似于”roam”的项这样写:roam~将找到形如foam和roams的单词;roam~0.8,检索返回相似度在0.8以上的记录。
+存在操作符,要求符号”+”后的项必须在文档相应的域中存在
()用于构成子查询
[]包含范围检索,如检索某时间段记录,包含头尾,date:[201507 TO 201510]
{}不包含范围检索,如检索某时间段记录,不包含头尾date:{201507 TO 201510}

1.1.3 高亮

符号意义
h1是否高亮,hl=true,表示采用高亮
hl.fl设定高亮显示的字段,用空格或逗号隔开的字段列表。要启用某个字段的highlight功能,就得保证该字段在schema中是stored。如果该参数未被给出,那么就会高亮默认字段 standard handler会用df参数,dismax字段用qf参数。你可以使用星号去方便的高亮所有字段。如果你使用了通配符,那么要考虑启用hl.requiredFieldMatch选项。
hl.requireFieldMatch如果置为true,除非用hl.fl指定了该字段,查询结果才会被高亮。它的默认值是false。
hl.usePhraseHighlighter如果一个查询中含有短语(引号框起来的)那么会保证一定要完全匹配短语的才会被高亮。
hl.highlightMultiTerm如果使用通配符和模糊搜索,那么会确保与通配符匹配的term会高亮。默认为false,同时hl.usePhraseHighlighter要为true。
hl.fragsize返回的最大字符数。默认是100.如果为0,那么该字段不会被fragmented且整个字段的值会被返回。

1.1.4 分组

1.1.4.1 分组(Field Facet)

facet 参数字段必须被索引,facet=on facet=true

符号意义
facet.field分组的字段
facet.prefix表示Facet字段前缀
facet.limitFacet字段返回条数
facet.offict开始条数,偏移量,它与facet.limit配合使用可以达到分页的效果
facet.mincountFacet字段最小count,默认为0
facet.missing如果为on或true,那么将统计那些Facet字段值为null的记录
facet.sort表示 Facet 字段值以哪种顺序返回 .格式为 true(count)false(index,lex)true(count) 表示按照 count 值从大到小排列,false(index,lex) 表示按照字段值的自然顺序 (字母 , 数字的顺序 ) 排列 . 默认情况下为 true(count)

1.1.4.2 分组(Date Facet)

对日期类型的字段进行 Facet,Solr 为日期字段提供了更为方便的查询统计方式 .注意 , Date Facet的字段类型必须是 DateField( 或其子类型 ). 需要注意的是 , 使用 Date Facet 时 , 字段名 , 起始时间 , 结束时间 , 时间间隔这 4 个参数都必须提供 。

符号意义
facet.date该参数表示需要进行 Date Facet 的字段名 , 与 facet.field 一样 , 该参数可以被设置多次 , 表示对多个字段进行 Date Facet.
facet.date.start起始时间 , 时间的一般格式为 ” 2015-12-31T23:59:59Z”, 另外可以使用 ”NOW”,”YEAR”,”MONTH” 等等 ,
facet.date.end结束时间
facet.date.gap时间间隔,如果 start 为 2015-1-1,end 为 2016-1-1,gap 设置为 ”+1MONTH” 表示间隔1 个月 , 那么将会把这段时间划分为 12 个间隔段 .
facet.date.hardend表示 gap 迭代到 end 时,还剩余的一部分时间段,是否继续去下一个间隔. 取值可以为 true

1.2 创建索引文件

1.2.1 使用Post上传文件

1.2.1.1 Linux下使用

Solr 包含一个简单的命令行工具,即 Post 工具(bin/post 工具),用于将各种类型的内容发布到 Solr 服务器。
bin/post 工具是一个 Unix shell 脚本;对于 Windows使用情况不支持

1.2.1.1.1 索引XML

将文件扩展名为 .xml 的所有文档添加到命名为 gettingstarted 的集合或核心中。

bin/post -c gettingstarted *.xml

将所有带有文件扩展名为 .xml 的文档添加到在端口 8984 上运行的 Solr 上的 gettingstarted 集合/内核。

bin/post -c gettingstarted -p 8984 *.xml

发送 XML 参数以从 gettingstarted 中删除文档。

bin/post -c gettingstarted -d '<delete><id>42</id></delete>'
1.2.1.1.2 索引 CSV

将所有 CSV 文件索引到 gettingstarted

bin/post -c gettingstarted *.csv

将制表符分隔的文件索引到 gettingstarted:

bin/post -c signals -params "separator=%09" -type text/csv data.tsv

内容类型(-type)参数是需要将文件视为正确的类型,否则将被忽略,并记录一个警告,因为它不知道 .tsv 文件是什么类型的内容。该 CSV 处理器支持 separator 参数,并通过使用 -params 设置传递。

1.2.1.1.3 索引 JSON

将所有 JSON 文件编入索引 gettingstarted。

bin/post -c gettingstarted *.json
1.2.1.1.4 索引丰富的文档(PDF、Word、HTML等)

PDF 文件索引到 gettingstarted。

bin/post -c gettingstarted a.pdf

自动检测文件夹中的内容类型,并对其进行递归扫描,以便为编入 gettingstarted 的文档进行索引。

bin/post -c gettingstarted afolder/

自动检测文件夹中的内容类型,但将其限制为 PPT 和 HTML 文件并将其索引到 gettingstarted。

bin/post -c gettingstarted -filetypes ppt,html afolder/
1.2.1.1.5 索引到受密码保护的 Solr(基本身份验证)

索引一个 PDF 作为用户 solr 使用密码 SolrRocks:

bin/post -u solr:SolrRocks -c gettingstarted a.pdf

1.2.1.2 Windows下使用

由于bin/post 目前仅作为 Unix shell 脚本存在,但是它将其工作委派给了一个具有跨平台能力的 Java 程序。该 SimplePostTool 可以直接在支持的环境,包括 Windows 上运行。

1.2.1.2.1 SimplePostTool

bin/post 脚本目前委托给一个名为 SimplePostTool 的独立 Java 程序。

捆绑到可执行 JAR 中的这个工具可以直接运行 java -jar example/exampledocs/post.jar。可以直接发送命令到 Solr 服务器。

java -jar example/exampledocs/post.jar -h
SimplePostTool version 5.0.0
Usage: java [SystemProperties] -jar post.jar [-h|-] [<file|folder|url|arg> [<file|folder|url|arg>...]]

索引文件示例:
上传csv文件到指定核心实例 : java -Dc=test_core -Dtype=text/csv -jar example/exampledocs/post.jar example/exampledocs/books.csv
在这里插入图片描述
如果是上传xml文件,则xml示例如下所示

<add>
<doc>
  <field name="id">USD</field>
  <field name="name">One Dollar</field>
  <field name="manu">Bank of America</field>
  <field name="manu_id_s">boa</field>
  <field name="cat">currency</field>
  <field name="features">Coins and notes</field>
  <field name="price_c">1,USD</field>
  <field name="inStock">true</field>
</doc>
<doc> ... </doc>
</add>

1.2.2 Dataimport页面报错

当选中一个核心实例时,Dataimport页面报错

The solrconfig.xml file for this index does not have an operational DataImportHandler defined!

1.2.2.1 修改solrconfig.xml

修改方法在当前核心实例的下操作,比如选中test_core,在路径server\solr\test_core\conf下打开文件solrconfig.xml,在里边加入如下内容,放置的位置你可以放到其他requestHandler 旁边:

<requestHandler name="/dataimport" class="solr.DataImportHandler"> 
      <lst name="defaults"> 
        <str name="config">data-config.xml</str> 
      </lst> 
    </requestHandler>

1.2.2.2 data-config.xml

data-config.xml文件配置在和solrconfig.xml同样位置即可

<dataConfig>
    <dataSource name="jdbcDataSource" type="JdbcDataSource" 
    driver="oracle.jdbc.driver.OracleDriver"
    url="jdbc:oracle:thin:@localhost:1521:orcl" 
    user="test" password="test"/>
    <document>
        <entity dataSource="jdbcDataSource" name="country"  
        query="select * from test" >
            <field column="ID" name="id"></field>
            <field column="SORT" name="sort"></field>
        </entity>
    </document>
  </dataConfig>

dataconfig的结构不是一成不变的,entityfield元素中的属性是随意的,这主要取决于processortransformer
以下是entity的默认属性:

  • name(必需的):name是唯一的,用以标识entity
  • processor:只有当datasource不是RDBMS时才是必需的。默认值是SqlEntityProcessor
  • transformer:转换器将会被应用到这个entity上
  • pkentity的主键,它是可选的,但使用“增量导入”的时候是必需。它跟schema.xml中定义的uniqueKey没有必然的联系,但它们可以相同。
  • rootEntity:默认情况下,document元素下就是根实体了,如果没有根实体的话,直接在实体下面的实体将会被看做跟实体。对于根实体对应的数据库中返回的数据的每一行,solr都将生成一个document

SqlEntityProcessor的属性

  • query (required) :sql语句
  • deltaQuery : 只在“增量导入”中使用
  • parentDeltaQuery : 只在“增量导入”中使用
  • deletedPkQuery : 只在“增量导入”中使用
  • deltaImportQuery : (只在“增量导入”中使用) . 如果这个存在,那么它将会在“增量导入”中导入phase时代替query产生作用。

数据源也可以配置在solrconfig.xml

<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/dbname" user="db_username" password="db_password"/>
  • driver(必需的):jdbc驱动名称
  • url(必需的):jdbc链接
  • user:用户名
  • password:密码
  • type 指定了实现的类型。它是可选的。默认的实现是JdbcDataSource
  • namedatasources的名字,当有多个datasources时,可以使用name属性加以区分
    其他的属性都是随意的,根据你使用的DataSource实现而定。
  • 多数据源
    一个配置文件可以配置多个数据源。增加一个dataSource元素就可以增加一个数据源了。name属性可以区分不同的数据源。如果配置了多于一个的数据源,那么要注意将name配置成唯一的
<dataSource type="JdbcDataSource" name="ds-1" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://db1-host/dbname" user="db_username" password="db_password"/>

<dataSource type="JdbcDataSource" name="ds-2" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://db2-host/dbname" user="db_username" password="db_password"/>

然后这样使用 …

<entity name="one" dataSource="ds-1" ...>
   ..
</entity>
<entity name="two" dataSource="ds-2" ...>
   ..
</entity>

1.2.2.3 迁移jar包

在解压后的solr压缩包dist文件夹内的包(如下所示)迁移到解压后的server\solr-webapp\webapp\WEB-INF\lib文件夹内
在这里插入图片描述

2 第三方工具 SolrJ

使用一个第三方工具 SolrJ,使用 Java 语言来把数据加入到索引里

2.1 pom.xml


<dependency>
    <groupId>org.apache.solr</groupId>
    <artifactId>solr-solrj</artifactId>
    <version>9.0.0</version>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.24</version>
</dependency>
<dependency>
  <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.8.0</version>
</dependency>

2.2 模板数据和实体

10001,房屋卫士自流平美缝剂瓷砖地砖专用双组份真瓷胶防水填缝剂镏金色,品质建材,398.00,上海,540785126782
10002,艾瑞泽手工大号小号调温热熔胶枪玻璃胶枪硅胶条热溶胶棒20W-100W,品质建材,21.80,山东青岛,24727352473
10003,HIGOLD/悍高 水槽双槽 厨房洗菜盆304不锈钢加厚拉丝手工水槽套餐,品质建材,2198.00,广东佛山,40972207020

实体类,每个字段上都有 @Field 注解,用来告诉 Solr 这些和 core里的字段对应

import lombok.Data;
import org.apache.solr.client.solrj.beans.Field;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Product {
    @Field
    int id;
    @Field
    String name;
    @Field
    String category;
    @Field
    float price;
    @Field
    String place;
    @Field
    String code;
}

2.3 实体工具类

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class ProductUtil {

    public static void main(String[] args) throws IOException{
        String fileName = "D:\\Users\\admin\\Desktop\\140k_products.txt";

        List<Product> products = file2List(fileName);

        System.out.println(products.size());
    }

    public static List<Product> file2List(String fileName) throws IOException{
        File file = new File(fileName);
        List<String> strings = FileUtils.readLines(file, "UTF-8");
        List<Product> productList = new ArrayList<>();
        for(String str:strings){
            String[] split = str.split(",");
            Product product = new Product(Integer.parseInt(split[0]),split[1],split[2],Float.parseFloat(split[3]),split[4],split[5]);
            productList.add(product);
        }
        return productList;
    }
}

2.4 读取工具类

import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.beans.DocumentObjectBinder;
import org.apache.solr.client.solrj.impl.Http2SolrClient;
import org.apache.solr.common.SolrInputDocument;

import java.util.List;

public class SolrUtil {

    public static SolrClient client;
    private static String url;
    static {
        url="http://localhost:8983/solr/test001";
        client=new Http2SolrClient.Builder(url).build();
    }

    public static <T> boolean batchSaveOrUpdate(List<T> entitites) throws Exception{
        DocumentObjectBinder binder = new DocumentObjectBinder();
        int total = entitites.size();
        int count=0;
        for(T t:entitites){
            SolrInputDocument doc = binder.toSolrInputDocument(t);
            client.add(doc);
            System.out.printf("添加数据到索引中,总共要添加 %d 条记录,当前添加 第 %d %n",total,++count);
        }
        client.commit();
       // client.close();
        return true;
    }
}

main方法调用

public static void main(String[] args) throws Exception {
    String fileName = "D:\\Users\\admin\\Desktop\\140k_products.txt";
    List<Product> products = ProductUtil.file2List(fileName);
    SolrUtil.batchSaveOrUpdate(products);
}

2.5 查询分析

2.5.1 分页查询

public static QueryResponse query(String keywords,int startOfPage,int numberOfPage) throws Exception{
   SolrQuery query = new SolrQuery();
   query.setStart(startOfPage);
   query.setRows(numberOfPage);

   query.setQuery(keywords);
   QueryResponse rsp = client.query(query);
  // client.close();
   return rsp;
}

main方法调用

import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;

import java.util.Collection;

public class PageQuery {
    public static void main(String[] args) throws Exception{
        QueryResponse query = SolrUtil.query("name:手机", 0, 10);
        SolrDocumentList results = query.getResults();
        System.out.println("累计找到的条数:"+results.getNumFound());
        if(!results.isEmpty()){
        //	先 打印 求出列名
            Collection<String> fieldNameList = results.get(0).getFieldNames();
            for(String filedName:fieldNameList){
                System.out.print(filedName+"\t");
            }
            System.out.println();
        }
        for (SolrDocument result:results){
            Collection<String> fieldNames = result.getFieldNames();
            // 根据字段名 求 值
            for(String field:fieldNames){
                System.out.print(result.get(field)+"\t");
            }
            System.out.println();
        }
    }
}

2.5.2 高亮查询

public static void queryHighLight(String keywords) throws Exception{
        SolrQuery query = new SolrQuery();
        query.setStart(0);//开始页数
        query.setRows(10);//每页显示条数
        query.setQuery(keywords);// 设置查询关键字
        query.setHighlight(true);// 开启高亮
        query.addHighlightField("name"); // 高亮字段
        query.setHighlightSimplePre("<span style='color:red'>");// 高亮单词的前缀
        query.setHighlightSimplePost("</span>"); // 高亮单词的后缀

        query.setHighlightFragsize(100);//摘要最长100个字符
        QueryResponse resp = client.query(query); //查询
        client.close();
        NamedList<Object> response = resp.getResponse();//获取高亮字段name相应结果
        NamedList<?> highlighting = (NamedList<?>) response.get("highlighting");
        for (int i = 0; i < highlighting.size(); i++) {
            System.out.println(highlighting.getName(i) + ":" + highlighting.getVal(i));
        }

        //获取查询结果
        SolrDocumentList results = resp.getResults();
        for (SolrDocument result : results) {
            System.out.println(result.toString());
        }

    }

main调用

public static void main(String[] args) throws Exception{
    SolrUtil.queryHighLight("name:手机");
}

2.6 修改更新删除索引文件

//增加或者更新索引
public static <T> boolean saveOrUpdate(T entity) throws Exception{
    DocumentObjectBinder binder = new DocumentObjectBinder();
    SolrInputDocument doc = binder.toSolrInputDocument(entity);
    client.add(doc);
    client.commit();  
    return true;
}
//删除索引
public static <T> boolean deleteById(String id) throws Exception{
    try {
        client.deleteById(id);
        client.commit();
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
    return true;
}

main方法调用

import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;

import java.util.Collection;

public class TestSolr4j {

    public static void main(String[] args) throws Exception{
        String keyword = "name:手机";
        System.out.println("修改之前");
        query(keyword);

        Product product = new Product();
        product.setId(51173);
        product.setName("修改后的手机");
        SolrUtil.<Product>saveOrUpdate(product);
        System.out.println("修改之后");
        query(keyword);

        SolrUtil.deleteById("51173");
        System.out.println("删除之后");
        query(keyword);
    }


    public static void query(String keyword) throws Exception{
        QueryResponse response = SolrUtil.query(keyword, 0, 10);
        SolrDocumentList resultList = response.getResults();
        System.out.println("累计找到的条数:"+resultList.getNumFound());
        if(!resultList.isEmpty()){
            Collection<String> fieldNameList = resultList.get(0).getFieldNames();
            for(String filedName:fieldNameList){
                System.out.print(filedName+"\t");
            }
            System.out.println();
        }
        for (SolrDocument result:resultList){
            Collection<String> fieldNames = result.getFieldNames();
            for(String field:fieldNames){
                System.out.print(result.get(field)+"\t");
            }
            System.out.println();
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/451901.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BDCC- 数据湖体系

文章目录 数据湖的概念数据湖 vs 数据仓库 vs Lakehouse① 业界进展&#xff08;Databricks 2.0&#xff09;-湖上建仓② 业界进展&#xff08;Snowflake EDW 2.0&#xff09;-仓外挂湖 LakeHouse 的演进&#xff08;1&#xff09;Lakehouse 的演进路线&#xff08;2&#xff0…

基于matlab的长短期神经网络LSTM的电力负荷预测

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 基于长短期神经网络LSTM的电力负荷预测 MATALB代码 效果图 结果分析 展望 参考论文 背影 电力负荷预测的实质是从已知的电力系统&#xff0c;经济&#xff0c;社会&#xff0c;气象等情况出发&#xff0c;根据历史负荷变化规律…

CSDN 周赛 48 期

CSDN 周赛 48 期 工作日参赛1、题目名称&#xff1a;最后一位2、题目名称&#xff1a;天然气订单3、题目名称&#xff1a;排查网络故障4、题目名称&#xff1a;运输石油小结 工作日参赛 说实话&#xff0c;今天是周末&#xff0c;但是今天也是工作日&#xff0c;老顾已经预计到…

Tossim 教程

系列文章目录 TinyOS 系列文章【一】&#xff1a;TinyOS 配置教程 TinyOS 系列文章【二】&#xff1a;Tossim 教程 文章目录 系列文章目录前言1. Tossim 简介2. TOSSIM 仿真2.1. 编译 TOSSIM2.2. 基于 Python 的仿真2.3. 调试语句2.4. 网络配置 总结 前言 本文主要用于记录在…

打破广播电视行业前端摄录设备依赖进口局面,BOSMA博冠全新国产8K摄像机重新定义广播世界

《世界广播电视》杂志曾经预测&#xff0c;2025年全球将有1000个超高清频道在播出。中国广电总局提出&#xff0c;到2025年底&#xff0c;标清频道基本关停&#xff0c;省级电视台要基本具备超高清电视制播能力。视频超高清已成为一个国际趋势。中国有14亿人口&#xff0c;是全…

蓝牙设备节点协议栈基础知识

蓝牙设备节点协议栈基础知识 一&#xff1a;TTY&#xff08;虚拟控制台&#xff0c;串口以及伪终端设备组成的终端设备&#xff09; Android/Linux 几乎所有的外设都以”设备节点”的形式存在 例如PC插入串口,会识别成COM1/COM2…在linux下面则以/dev/ttyXXX的形式存在,如/dev…

国家信息安全水平考试中NISP一级网络安全证书介绍

1、什么是NISP? 国家信息安全水平考试&#xff08;National Information Security Test Program&#xff0c;简称NISP&#xff09;&#xff0c;是由中国信息安全测评中心实施培养国家网络空间安全人才的项目。 2、考取NISP一级认证的同学就业岗位和薪资标准有那些呢&#xf…

Docker创建镜像,建立网桥,容器制作虚拟机

新建基础镜像&#xff0c;希望能够SSH&#xff0c;安装java&#xff0c;用户&#xff0c;声明22端口等等&#xff1b;拷贝基础hadoop安装文件 新建Dockerfile FROM centos:7.9.2009RUN rm -f /etc/localtime && ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/local…

【C++】Windows使用Visual Studio C++链接云数据库PostgreSQL(沉浸式老爷教学)

Windows使用C Visual Studio链接云数据库PostgreSQL 一、前置条件二、安装PostgreSQL工具三、编译libpqxx库四、Visual Studio配置测试**如果对您有帮助&#xff0c;关注收藏&#xff01;** 关注 “测试开发自动化” 公众号&#xff0c;获取更多学习内容 一、前置条件 下载lib…

MQTT 开放基准测试规范:全面评估你的 MQTT Broker 性能

引言 我们很高兴地宣布&#xff1a;由 EMQ 提供的 MQTT 开放基准测试规范现已正式发布&#xff01; 该测试规范包含了实用的典型使用场景、一套衡量 Broker 性能的主要指标&#xff0c;以及一个模拟负载和收集测试结果的工具&#xff0c;可以帮助开发者评估 MQTT Broker 的可…

让同为2.4G的ZigBee与Wi-Fi相容的解决方案解析

2.4G (WIFI,BT,ZIGBEE,普通2.4G 无线) 4种2.4G 无线通信协议。 普通2.4G 无线 最便宜。 众所周知&#xff0c;小米的智能套装包含的4件套&#xff0c;人体传感器、门窗传感器、无线开关与多功能网关采用的是基于NXP的一颗工业级ZigBee射频芯片–JN5168进行组网通讯。而多功能网…

office实操技能01:修改微软Office页面的(非背景的)浅绿底色、设置默认字体和主题颜色、取消页眉横线、PPT默认的等线字体

目录 1 处理word中默认中文字体是等线的问题 2 处理word中没有设置背景色&#xff0c;但页面底色是浅绿色的问题 3 修改office的主题颜色 4 删除页眉横线 5 处理PPT中的等线字体 这篇博文主要介绍两个使用技能&#xff1a; 技能1&#xff1a;修改word的默认等线字体技能2&…

( “树” 之 BST) 653. 两数之和 IV - 输入二叉搜索树 ——【Leetcode每日一题】

二叉查找树&#xff08;BST&#xff09;&#xff1a;根节点大于等于左子树所有节点&#xff0c;小于等于右子树所有节点。 二叉查找树中序遍历有序。 653. 两数之和 IV - 输入二叉搜索树 难度&#xff1a;简单 给定一个二叉搜索树 root 和一个目标结果 k&#xff0c;如果二叉…

关于Java注解的一些理解 小结

目录 1. 常用注解和理解 2. 自定义注解 2.1 案例背景 2.2 设计思路 3 总结 1. 常用注解和理解 注解在我的理解下&#xff0c;就是代码中的特殊标记&#xff0c;这些标记可以在编译、类加载、运行时被读取&#xff0c;并执行相对应的处理。 可能有些抽象&#xff0c;简单…

Web3中文|好莱坞新星如何成就电影业?

Web3 技术已经被用于电影行业&#xff0c;以建立社区并将利基内容代币化。NFT 将是好莱坞的下一个新星。 【利基&#xff08;niche&#xff09;是指针对企业的优势细分出来的市场&#xff0c;这个市场不大&#xff0c;而且没有得到令人满意的服务。产品推进这个市场&#xff0c…

DATAFAKER 使用方法记录

DATAFAKER 使用方法记录 win10 64位 Python 3.10.11 参考网址 datafaker的使用–详细教程 https://blog.csdn.net/A15517340610/article/details/105623103 https://github.com/gangly/datafaker python 版本 It is compatible with python2.7 and python3.4 也就是说 他…

开箱即用的ChatGPT替代模型,还可训练自己数据

一、普遍关注是什么&#xff1f; OpenAI 是第一个在该领域取得重大进展的公司&#xff0c;并且使围绕其服务构建抽象变得更加容易。然而&#xff0c;便利性带来了集中化、通过中介的成本、数据隐私和版权问题。 而数据主权和治理是这些新的LLM服务提供商如何处理商业秘密或敏…

Vue(数据绑定、el和data多种写法、理解MVVM、数据代理)

一、数据绑定 1. vue中有两种数据绑定&#xff08;通过开发者工具进行查看&#xff09; 1. 单项绑定&#xff08;v-bind&#xff09;数据只能从data流向页面 在输入框中中输入vue实例中的数据没有变化 2. 双向绑定&#xff08;v-model&#xff09;数据能从data流向页面&#x…

【Java 数据结构】二叉树的遍历 (递归和非递归实现)

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

大数据分析查询_Impala介绍_对HDFS_Hbase直接查询_速度快_组成架构_执行原理---大数据之Impala工作笔记0001

官网的地址:Impala (apache.org)https://impala.apache.org/ https://impala.apache.org/ 官网的地址: 首先我们看一下什么是impala,可以看到Impala是cloudera公司,也就是做Hadoop付费版的公司, 提供的,基于Hive的,因为他跟hive共用元数据,meta,他可以提供对HDFS,Hbase的SQL…