Git是一个开源的分布式版本控制系统,用以有效、高效地处理从小型到大型项目的版本管理。Git仓库可以公开或私有,公开的仓库可以让任何人访问,而私有的则需要特定的权限。

在Git中,有一个概念叫做“公开 upstream”,通常指的是一个开源项目的原始仓库,任何人都可以访问并基于它进行修改或贡献代码。

如果你想将你的Git仓库公开,你可以按照以下步骤操作:

  1. 创建一个新的公开仓库:



# 在GitHub上
git init
git remote add origin https://github.com/username/repository.git
git push -u origin master
  1. 将现有的本地仓库变更为公开:

首先,确保你已经有一个Git仓库,并已经有了一些提交(commit)。

然后,你可以通过以下步骤将你的仓库公开:

  • 登录到GitHub(或其他Git托管服务)。
  • 创建一个新的仓库,确保不要勾选“Initialize this repository with a README”选项。
  • 在终端中,将远程仓库添加到你的本地仓库配置中。



git remote add origin https://github.com/username/repository.git
  • 推送你的本地分支和设置远程仓库。



git push -u origin master

这样,你的Git仓库就变成了公开的。任何有适当权限的用户都可以访问和克隆这个公开的仓库。

注意:确保不要在公开的仓库中存储敏感信息,例如密码、API密钥等。

倒排索引是Elasticsearch的核心。它允许在文档集合中快速检索包含特定项(例如单词)的文档。

倒排索引的构建过程如下:

  1. 文档分割:将文档内容分割成单独的词(或者称为Term)。
  2. 创建词典:对所有词进行排序并创建索引。
  3. 创建倒排列表:记录每个词出现的文档集合。

例如,对于以下两个文档:

文档1: "Elasticsearch is a distributed, RESTful search engine"

文档2: "Elasticsearch is fast, distributed, scalable"

创建倒排索引如下:

词典(terms):

  • "a"
  • "distributed"
  • "elasticsearch"
  • "fast"
  • "is"
  • "restful"
  • "scalable"
  • "search"
  • "engine"

倒排列表(postings list):

  • "Elasticsearch": [1, 2]
  • "is": [1, 2]
  • "a": [1]
  • "distributed": [1, 2]
  • "fast": [2]
  • "restful": [1]
  • "scalable": [2]
  • "search": [1]
  • "engine": [1]

在Elasticsearch中,倒排列表称为Inverted Index,它是一个数据结构,用于快速检索包含特定词条的文档。

以上就是Elasticsearch倒排索引的基本概念和构建过程。在实践中,Elasticsearch会进一步优化倒排列表,例如,通过区间查询优化大量重复值的存储,通过前缀编码等方式减少索引的大小等等。




PUT /my_index
{
  "mappings": {
    "properties": {
      "text": {
        "type": "text",
        "fields": {
          "semantic_text": {
            "type": "text",
            "analyzer": "semantic_analyzer"
          }
        }
      }
    },
    "settings": {
      "analysis": {
        "analyzer": {
          "semantic_analyzer": {
            "tokenizer": "standard",
            "filter": [
              "lowercase",
              "stop",
              "stemmer_override",
              "kstem",
              "reverse",
              "word_delimiter",
              "stemmer"
            ]
          }
        },
        "filter": {
          "stemmer_override": {
            "type": "stemmer_override",
            "rules_path": "analysis/stemmer_override.txt"
          },
          "stemmer": {
            "type": "stemmer",
            "language": "english"
          }
        }
      }
    }
  }
}

这个代码示例演示了如何在Elasticsearch中定义一个包含语义分析的字段semantic_text。它使用了自定义的分析器semantic_analyzer,该分析器包含一系列的分词器和过滤器来进行语义处理。在此示例中,我们使用了stemmer_override来提供特定词汇的词干形式的例外,kstem用于将复数形式还原到单数形式,reverse用于将词汇反转以捕获类似词的查询,word_delimiter用于更好地处理词的变形(例如,将"jumping"转换为"jump"),以及stemmer提供了英语的词干分析能力。这样,在搜索时,可以同时对原始文本和语义文本进行查询,以提供更广泛的匹配性。




{
    "job": {
        "setting": {
            "speed": {
                "channel": 1
            }
        },
        "content": [
            {
                "reader": {
                    "name": "mysqlreader",
                    "parameter": {
                        "username": "your_username",
                        "password": "your_password",
                        "column": ["id", "name", "age"],
                        "connection": [
                            {
                                "querySql": "select id, name, age from your_table",
                                "jdbcUrl": [
                                    "jdbc:mysql://your_host:your_port/your_database"
                                ]
                            }
                        ]
                    }
                },
                "writer": {
                    "name": "streamwriter",
                    "parameter": {
                        "print": true
                    }
                },
                "transformer": [
                    {
                        "name": "dx_transformer",
                        "parameter": {
                            "transformRules": {
                                "age": {
                                    "eval": "age + 1"
                                }
                            }
                        }
                    }
                ]
            }
        ]
    }
}

这个JSON配置文件定义了一个DataX作业,它从MySQL读取数据,通过自定义的dx_transformer转换器增加age字段的值,然后将结果输出到控制台。这个转换器可以通过配置规则来实现复杂的数据转换逻辑。这个实例展示了如何在DataX中使用转换器来处理同步的数据。

以下是搭建Elasticsearch 7.7.0三节点集群的基本步骤,使用Docker方式:

  1. 准备Elasticsearch Docker配置文件 elasticsearch.ymldocker-compose.yml

elasticsearch.yml 示例配置:




cluster.name: my-es-cluster
node.name: node-1
network.host: 0.0.0.0
discovery.seed_hosts:
  - node-1
  - node-2
  - node-3
cluster.initial_master_nodes:
  - node-1
  - node-2
  - node-3
http.cors.enabled: true
http.cors.allow-origin: "*"

docker-compose.yml 示例配置(三个节点):




version: '2.2'
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.7.0
    container_name: es01
    environment:
      - node.name=node-1
      - cluster.name=my-es-cluster
      - discovery.seed_hosts=es02,es03
      - cluster.initial_master_nodes=node-1
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata01:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - esnet
  es02:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.7.0
    container_name: es02
    environment:
      - node.name=node-2
      - cluster.name=my-es-cluster
      - discovery.seed_hosts=es01,es03
      - cluster.initial_master_nodes=node-1
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata02:/usr/share/elasticsearch/data
    networks:
      - esnet
  es03:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.7.0
    container_name: es03
    environment:
      - node.name=node-3
      - cluster.name=my-es-cluster
      - discovery.seed_hosts=es01,es02
      - cluster.initial_master_nodes=node-1
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata03:/usr/share/elasticsearch/data
    networks:
      - esnet
volumes:
  esdata01:
    driver: local
  esdata02:
    driver: local
  esdata03:
    driver: local
networks:
  esnet:
    driver: 

Elasticsearch提供了多种方式来搜索字符串字段。以下是一些常用的字符串搜索方式:

  1. 完全匹配搜索:使用match_phrase查询进行确切的短语搜索。



GET /_search
{
  "query": {
    "match_phrase": {
      "field": "text to search for"
    }
  }
}
  1. 全文搜索:使用match查询进行全文搜索,可以对字段进行分词后再进行匹配。



GET /_search
{
  "query": {
    "match": {
      "field": "text to search for"
    }
  }
}
  1. 多字段搜索:使用multi_match查询在多个字段中进行搜索。



GET /_search
{
  "query": {
    "multi_match": {
      "query":    "text to search for",
      "fields":   ["title", "body"]
    }
  }
}
  1. 模糊搜索:使用fuzzy查询进行模糊匹配,可以找到接近给定词的文档。



GET /_search
{
  "query": {
    "fuzzy": {
      "field": "text to search for"
    }
  }
}
  1. 通配符搜索:使用wildcard查询进行通配符搜索。



GET /_search
{
  "query": {
    "wildcard": {
      "field": "te*t"
    }
  }
}
  1. 正则表达式搜索:使用regexp查询进行正则表达式搜索。



GET /_search
{
  "query": {
    "regexp": {
      "field.keyword": "rege(xp)?"
    }
  }
}
  1. 字段存在查询:使用exists查询检查字段是否存在。



GET /_search
{
  "query": {
    "exists": {
      "field": "user"
    }
  }
}
  1. 字段不存在查询:使用exists查询的must_not子句检查字段是否不存在。



GET /_search
{
  "query": {
    "bool": {
      "must_not": {
        "exists": {
          "field": "user"
        }
      }
    }
  }
}
  1. 范围查询:使用range查询在数值或时间范围内搜索。



GET /_search
{
  "query": {
    "range": {
      "age": {
        "gte": 20,
        "lte": 30
      }
    }
  }
}
  1. 布尔查询:使用bool查询结合must, should, must_not子句进行复杂查询。



GET /_search
{
  "query": {
    "bool": {
      "must":     { "match": { "title": "Quick" }},
      "must_not": { "match": { "title": "lazy"  }},
      "should":   { "match": { "title": "brown" }}
    }
  }
}
  1. 过滤器查询:使用constant_score查询结合filter子句进行不计分的过滤。



GET /_search
{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "user.id": "kimchy"
        }
      }
    }
  }
}

12

在Java中操作Elasticsearch,你可以使用Elasticsearch的Java API客户端——Elasticsearch-Rest-High-Level-Client。以下是一些基本操作的示例代码:

  1. 创建客户端:



RestHighLevelClient client = new RestHighLevelClient(
        RestClient.builder(
                new HttpHost("localhost", 9200, "http"),
                new HttpHost("localhost", 9201, "http")));
  1. 索引文档:



IndexRequest request = new IndexRequest("index_name");
request.id("id");
request.source(XContentType.JSON, "field", "value");
 
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
  1. 获取文档:



GetRequest getRequest = new GetRequest("index_name", "id");
 
GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
  1. 更新文档:



UpdateRequest updateRequest = new UpdateRequest("index_name", "id");
updateRequest.doc(XContentType.JSON, "field", "new_value");
 
UpdateResponse updateResponse = client.update(updateRequest, RequestOptions.DEFAULT);
  1. 删除文档:



DeleteRequest deleteRequest = new DeleteRequest("index_name", "id");
 
DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);
  1. 搜索文档:



SearchRequest searchRequest = new SearchRequest("index_name");
 
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery("field", "value"));
 
searchRequest.source(searchSourceBuilder);
 
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  1. 关闭客户端:



client.close();

确保你的项目中包含了Elasticsearch的依赖。如果你使用Maven,可以添加如下依赖:




<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.10.0</version>
</dependency>

请根据你的Elasticsearch版本选择合适的客户端版本。

在Linux上安装Elasticsearch的步骤通常包括以下几个步骤:

  1. 导入Elasticsearch公钥。
  2. 创建Elasticsearch的存储库。
  3. 安装Elasticsearch。
  4. 启动Elasticsearch服务。

以下是基于Debian/Ubuntu系统的示例步骤:




# 1. 导入Elasticsearch公钥
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
 
# 2. 添加Elasticsearch的APT源
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list
 
# 更新APT源
sudo apt-get update
 
# 3. 安装Elasticsearch
sudo apt-get install elasticsearch
 
# 4. 启动Elasticsearch服务
sudo systemctl start elasticsearch
 
# (可选)设置Elasticsearch随系统启动
sudo systemctl enable elasticsearch

请根据你的Linux发行版和Elasticsearch的版本,选择正确的指令和源地址。上述代码是基于Elasticsearch 7.x版本,如果你需要安装其他版本,请更换相应的源地址。

注意:确保你拥有足够的权限来执行上述命令,可能需要使用sudo

报错信息提示“Request processing failed: org.mybatis.spring.MyBatisSystemException”表明在使用Spring框架集成MyBatis时,处理请求时发生了异常。MyBatisSystemException是MyBatis与Spring集成时,由Spring包装的MyBatis异常的父类。

解决这个问题通常需要以下步骤:

  1. 查看完整的异常堆栈跟踪信息,以确定异常的确切原因。
  2. 检查引发异常的SQL语句或MyBatis映射文件中的问题,如SQL语法错误、参数绑定问题等。
  3. 确认相关的Mapper接口和XML映射文件是否正确配置,并且已经被Spring容器管理。
  4. 检查Spring配置文件中MyBatis的相关配置,确保没有配置错误。
  5. 如果使用了Spring事务管理,检查事务配置是否正确,包括传播行为、隔离级别等。
  6. 如果异常与依赖注入有关,检查Spring的Bean配置是否正确,包括作用域定义、依赖注入点。

解决这类问题通常需要详细的错误日志和代码审查,因此建议在开发环境中调试并查看详细的异常信息。

在Elasticsearch中,调优搜索速度通常涉及以下几个方面:

  1. 优化索引设置:确保使用合适的分词器、索引时的refresh\_interval、NRT(Near Real Time)设置等。
  2. 调整查询:避免使用太复杂的查询,尽量保持查询简单。
  3. 调整分页大小:减少每页的结果数量,减少内存和CPU的消耗。
  4. 使用批量查询:通过批量一次性查询多个文档来减少网络开销和查询次数。
  5. 调优节点配置:根据不同的节点类型(如数据节点、协调节点)调整JVM参数、内存分配等。
  6. 使用更快的硬件:增加内存、使用更快的磁盘I/O。

以下是一个简单的Elasticsearch批量查询的代码示例:




import org.elasticsearch.action.search.MultiSearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
 
import java.io.IOException;
 
public class MultiSearchExample {
    public static void main(String[] args) throws IOException {
        try (RestHighLevelClient client = new RestHighLevelClient(...)) {
            // 创建多个搜索请求
            SearchSourceBuilder searchSourceBuilder1 = new SearchSourceBuilder();
            searchSourceBuilder1.query(QueryBuilders.matchQuery("content", "Elasticsearch"));
 
            SearchSourceBuilder searchSourceBuilder2 = new SearchSourceBuilder();
            searchSourceBuilder2.query(QueryBuilders.matchQuery("content", "Java"));
 
            // 执行多搜索
            MultiSearchResponse response = client.multiSearch(
                new MultiSearchRequest()
                    .add(new SearchRequest("index1").source(searchSourceBuilder1))
                    .add(new SearchRequest("index2").source(searchSourceBuilder2)),
                RequestOptions.DEFAULT);
 
            // 处理多搜索响应
            for (MultiSearchResponse.Item item : response.getResponses()) {
                if (item.getResponse().isExists()) {
                    // 处理搜索结果
                }
            }
        }
    }
}

在实际应用中,还需要根据具体的Elasticsearch集群状态、查询负载和硬件资源进行调优。