最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

30分鐘教你上手用Java快速搭建你的第一個(gè)向量數(shù)據(jù)庫

 更新時(shí)間:2026年04月29日 09:10:43   作者:canjun_wen  
在?AI?大爆發(fā)的時(shí)代,向量數(shù)據(jù)庫成為連接原始數(shù)據(jù)與大模型的核心樞紐,如果你是?Java?開發(fā)者,想快速搭上向量數(shù)據(jù)庫的快車,這篇實(shí)操指南就是為你準(zhǔn)備的,全程無需復(fù)雜環(huán)境配置,30?分鐘內(nèi)帶你從?0?到?1?搭建可運(yùn)行的向量數(shù)據(jù)庫應(yīng)用

在 AI 大爆發(fā)的時(shí)代,向量數(shù)據(jù)庫成為連接原始數(shù)據(jù)與大模型的核心樞紐——它能高效存儲、檢索“向量化”的文本、圖片等數(shù)據(jù),為語義搜索、智能推薦等場景提供底層支撐。如果你是 Java 開發(fā)者,想快速搭上向量數(shù)據(jù)庫的快車,這篇實(shí)操指南就是為你準(zhǔn)備的。全程無需復(fù)雜環(huán)境配置,30 分鐘內(nèi)帶你從 0 到 1 搭建可運(yùn)行的向量數(shù)據(jù)庫應(yīng)用。

一、先搞懂核心問題:什么是向量數(shù)據(jù)庫?

在動(dòng)手前,我們先花 2 分鐘理清核心概念,避免“知其然不知其所以然”。

傳統(tǒng)數(shù)據(jù)庫(如 MySQL)靠“精確匹配”查詢數(shù)據(jù)(比如搜索“蘋果手機(jī)”就只能找到含這五個(gè)字的結(jié)果),而向量數(shù)據(jù)庫存儲的是“向量”——一種將非結(jié)構(gòu)化數(shù)據(jù)(文本、圖片等)通過模型轉(zhuǎn)化成的多維數(shù)值數(shù)組。比如“貓喜歡吃魚”和“貓咪愛吃小魚干”,轉(zhuǎn)化后的向量會(huì)非常接近。

向量數(shù)據(jù)庫的核心能力是“近似最近鄰搜索(ANN)”,能快速找到與目標(biāo)向量最相似的數(shù)據(jù),這正是 AI 場景需要的“語義理解”能力。

本次實(shí)操 我們選用 Milvus Lite(Milvus 向量數(shù)據(jù)庫的輕量版),它無需部署獨(dú)立服務(wù),直接嵌入 Java 應(yīng)用,對新手極度友好;配合 Java SDK 就能快速開發(fā),完美契合“快速上手”的需求。

二、環(huán)境準(zhǔn)備:3 分鐘搞定依賴與配置

工欲善其事,必先利其器。確保你的環(huán)境滿足基礎(chǔ)要求,然后快速完成配置。

1. 基礎(chǔ)環(huán)境要求

  • JDK 8 及以上(推薦 JDK 11,兼容性更好)
  • Maven 3.6+(用于依賴管理,也可用 Gradle)
  • 開發(fā)工具:IDEA 或 Eclipse(本次以 IDEA 為例)

2. 新建 Maven 項(xiàng)目并添加依賴

打開 IDEA,新建一個(gè)普通 Maven 項(xiàng)目(GroupId、ArtifactId 自定義即可),然后在 pom.xml 中添加以下依賴:

<dependencies>
    <dependency>
        <groupId>io.milvus</groupId>
        <artifactId>milvus-sdk-java</artifactId>
        <version>2.4.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.14.0</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>2.0.9</version>
    </dependency>
</dependencies>

點(diǎn)擊 Maven 刷新按鈕,等待依賴下載完成。Milvus Lite 會(huì)隨 SDK 自動(dòng)引入,無需額外安裝服務(wù),這也是我們選它的核心原因。

三、核心步驟:20 分鐘完成“建庫-插數(shù)-查詢”全流程

向量數(shù)據(jù)庫的核心操作流程是“連接數(shù)據(jù)庫 → 創(chuàng)建集合(類似傳統(tǒng)數(shù)據(jù)庫的表) → 插入向量數(shù)據(jù) → 執(zhí)行相似度查詢”。我們一步步拆解實(shí)現(xiàn)。

1. 第一步:連接 Milvus Lite 數(shù)據(jù)庫

新建一個(gè) VectorDbDemo.java 類,首先實(shí)現(xiàn)數(shù)據(jù)庫連接。Milvus Lite 以本地文件形式存儲數(shù)據(jù),連接時(shí)只需指定數(shù)據(jù)存儲路徑即可。

import io.milvus.client.MilvusClient;
import io.milvus.param.ConnectParam;
import io.milvus.param.MilvusClientParam;
import io.milvus.param.R;
import io.milvus.param.collection.CreateCollectionParam;
import io.milvus.param.collection.FieldType;
import io.milvus.param.dml.InsertParam;
import io.milvus.param.dml.SearchParam;
import io.milvus.response.InsertResponse;
import io.milvus.response.SearchResponse;
import org.apache.commons.lang3.RandomUtils;

import java.util.ArrayList;
import java.util.List;

public class VectorDbDemo {
    // Milvus Lite 數(shù)據(jù)庫連接地址(本地文件路徑,自定義)
    private static final String MILVUS_URL = "localhost:19530";
    // 集合名稱(類似表名,自定義)
    private static final String COLLECTION_NAME = "java_vector_demo";
    // 向量維度(需與生成的向量維度一致,這里選128維)
    private static final int VECTOR_DIM = 128;

    public static void main(String[] args) {
        // 1. 構(gòu)建連接參數(shù)
        ConnectParam connectParam = ConnectParam.newBuilder()
                .withHost("localhost")
                .withPort(19530)
                .build();

        // 2. 創(chuàng)建 Milvus 客戶端
        MilvusClient client = new MilvusClient(connectParam);

        // 測試連接是否成功
        R<Boolean> healthCheck = client.checkHealth();
        if (healthCheck.getData()) {
            System.out.println("? 數(shù)據(jù)庫連接成功!");
        } else {
            System.out.println("? 數(shù)據(jù)庫連接失?。? + healthCheck.getMessage());
            return;
        }

        // 后續(xù)操作(創(chuàng)建集合、插數(shù)、查詢)將在這里補(bǔ)充
    }
}

運(yùn)行 main 方法,如果控制臺輸出“? 數(shù)據(jù)庫連接成功!”,說明基礎(chǔ)連接已打通。Milvus Lite 會(huì)自動(dòng)在本地啟動(dòng)臨時(shí)服務(wù),退出程序后服務(wù)停止,數(shù)據(jù)會(huì)保存在默認(rèn)路徑。

2. 第二步:創(chuàng)建集合(定義數(shù)據(jù)結(jié)構(gòu))

集合是向量數(shù)據(jù)庫存儲數(shù)據(jù)的基本單元,類似 MySQL 的表。我們需要定義集合的字段,核心包含“主鍵字段”和“向量字段”,還可以添加“普通屬性字段”(如文本原文)。

在連接成功后,添加創(chuàng)建集合的代碼:

// 3. 創(chuàng)建集合(先判斷是否存在,存在則刪除)
if (client.hasCollection(COLLECTION_NAME).getData()) {
    client.dropCollection(COLLECTION_NAME);
    System.out.println("??  集合已存在,已刪除");
}

// 定義字段:主鍵字段(自增ID)
FieldType idField = FieldType.newBuilder()
        .withName("id")
        .withDataType(FieldType.DataType.Int64)
        .withPrimaryKey(true)
        .withAutoID(true) // 自增
        .build();

// 定義字段:向量字段(核心)
FieldType vectorField = FieldType.newBuilder()
        .withName("content_vector")
        .withDataType(FieldType.DataType.FloatVector)
        .withDimension(VECTOR_DIM) // 向量維度與生成的一致
        .build();

// 定義字段:普通屬性字段(存儲文本原文,方便查詢后展示)
FieldType textField = FieldType.newBuilder()
        .withName("text_content")
        .withDataType(FieldType.DataType.VarChar)
        .withMaxLength(512) // 文本最大長度
        .build();

// 構(gòu)建創(chuàng)建集合的參數(shù)
CreateCollectionParam createParam = CreateCollectionParam.newBuilder()
        .withCollectionName(COLLECTION_NAME)
        .addFieldType(idField)
        .addFieldType(vectorField)
        .addFieldType(textField)
        .withConsistencyLevel(CreateCollectionParam.ConsistencyLevelEnum.STRONG) // 一致性級別
        .build();

// 執(zhí)行創(chuàng)建集合
R<Boolean> createResult = client.createCollection(createParam);
if (createResult.getData()) {
    System.out.println("? 集合創(chuàng)建成功!");
} else {
    System.out.println("? 集合創(chuàng)建失?。? + createResult.getMessage());
    client.close();
    return;
}

這里我們定義了三個(gè)字段:id(自增主鍵)、content_vector(128維向量字段,核心)、text_content(存儲原始文本,方便結(jié)果展示)。執(zhí)行后控制臺會(huì)輸出“? 集合創(chuàng)建成功!”。

3. 第三步:生成向量并插入數(shù)據(jù)

向量數(shù)據(jù)庫存儲的是向量,所以我們需要先將原始文本轉(zhuǎn)化為向量。實(shí)際開發(fā)中會(huì)用專業(yè)模型(如 BERT、Sentence-BERT)生成向量,為了簡化演示,這里用隨機(jī)數(shù)模擬向量(后續(xù)會(huì)說明如何替換為真實(shí)模型)。

在集合創(chuàng)建成功后,添加“生成向量+插入數(shù)據(jù)”的代碼:

// 4. 生成測試數(shù)據(jù)(5條文本,模擬用戶問答場景)
List<String> textList = new ArrayList<>();
textList.add("Java 中如何創(chuàng)建線程?有幾種方式?");
textList.add("Java 線程的生命周期包括哪些狀態(tài)?");
textList.add("Spring Boot 如何配置數(shù)據(jù)庫連接池?");
textList.add("Spring Cloud 與 Spring Boot 的區(qū)別是什么?");
textList.add("Java 8 的 Lambda 表達(dá)式有什么用法?");

// 生成向量:將每條文本轉(zhuǎn)化為128維向量(模擬,實(shí)際用模型生成)
List<List<Float>> vectorList = new ArrayList<>();
for (int i = 0; i < textList.size(); i++) {
    List<Float> vector = new ArrayList<>();
    for (int j = 0; j < VECTOR_DIM; j++) {
        // 用隨機(jī)數(shù)模擬向量(真實(shí)場景替換為模型輸出)
        vector.add(RandomUtils.nextFloat(0.0f, 1.0f));
    }
    vectorList.add(vector);
}

// 構(gòu)建插入?yún)?shù)
InsertParam insertParam = InsertParam.newBuilder()
        .withCollectionName(COLLECTION_NAME)
        .addField("text_content", textList) // 插入文本字段
        .addField("content_vector", vectorList) // 插入向量字段
        .build();

// 執(zhí)行插入
R<InsertResponse> insertResult = client.insert(insertParam);
if (insertResult.getData() != null) {
    System.out.println("? 數(shù)據(jù)插入成功!插入條數(shù):" + textList.size());
    System.out.println("插入數(shù)據(jù)ID:" + insertResult.getData().getInsertIds());
} else {
    System.out.println("? 數(shù)據(jù)插入失?。? + insertResult.getMessage());
    client.close();
    return;
}

這里我們模擬了 5 條 Java 開發(fā)相關(guān)的文本數(shù)據(jù),并用隨機(jī)數(shù)生成對應(yīng)向量。執(zhí)行后控制臺會(huì)輸出插入成功的提示和數(shù)據(jù) ID,說明數(shù)據(jù)已存入向量數(shù)據(jù)庫。

真實(shí)場景向量生成:如果需要生成有語義意義的向量,可引入 sentence-transformers 等模型(Java 可通過 JNA 調(diào)用或使用國內(nèi)開源模型如 ERNIE),核心是將文本轉(zhuǎn)化為固定維度的浮點(diǎn)數(shù)數(shù)組,維度需與集合定義的 VECTOR_DIM 一致。

4. 第四步:創(chuàng)建索引并執(zhí)行相似度查詢

向量數(shù)據(jù)庫的查詢依賴“索引”來提升效率,沒有索引時(shí)會(huì)執(zhí)行全量掃描,速度較慢。我們先創(chuàng)建向量索引,再執(zhí)行相似度查詢。

在數(shù)據(jù)插入成功后,添加以下代碼:

// 5. 創(chuàng)建向量索引(提升查詢效率)
// 索引參數(shù)(IVF_FLAT 是基礎(chǔ)索引類型,適合小數(shù)據(jù)量)
String indexParam = String.format("{\"index_type\": \"IVF_FLAT\", \"params\": {\"nlist\": 1024}, \"metric_type\": \"L2\"}");
R<Boolean> createIndexResult = client.createIndex(
        COLLECTION_NAME,
        "content_vector", // 向量字段名
        indexParam
);
if (createIndexResult.getData()) {
    System.out.println("? 向量索引創(chuàng)建成功!");
} else {
    System.out.println("? 索引創(chuàng)建失?。? + createIndexResult.getMessage());
    client.close();
    return;
}

// 6. 加載集合到內(nèi)存(查詢前必須執(zhí)行)
R<Boolean> loadResult = client.loadCollection(COLLECTION_NAME);
if (loadResult.getData()) {
    System.out.println("? 集合加載到內(nèi)存成功!");
} else {
    System.out.println("? 集合加載失?。? + loadResult.getMessage());
    client.close();
    return;
}

// 7. 執(zhí)行相似度查詢(模擬用戶查詢:"Java 線程相關(guān)問題")
String queryText = "Java 線程相關(guān)問題";
// 生成查詢向量(同樣用隨機(jī)數(shù)模擬,真實(shí)場景與數(shù)據(jù)向量用同一模型生成)
List<Float> queryVector = new ArrayList<>();
for (int j = 0; j < VECTOR_DIM; j++) {
    queryVector.add(RandomUtils.nextFloat(0.0f, 1.0f));
}

// 構(gòu)建查詢參數(shù)
SearchParam searchParam = SearchParam.newBuilder()
        .withCollectionName(COLLECTION_NAME)
        .withMetricType(SearchParam.MetricType.L2) // 距離計(jì)算方式(L2為歐氏距離)
        .withTopK(2) // 返回最相似的2條數(shù)據(jù)
        .withVectorFieldName("content_vector")
        .addVector(queryVector)
        .withParams("{\"nprobe\": 10}") // 索引查詢參數(shù)
        .addOutputField("text_content") // 要返回的字段
        .build();

// 執(zhí)行查詢
R<SearchResponse> searchResult = client.search(searchParam);
if (searchResult.getData() != null) {
    System.out.println("\n?? 查詢結(jié)果(與\"" + queryText + "\"最相似的2條數(shù)據(jù)):");
    // 解析查詢結(jié)果
    SearchResponse.Data data = searchResult.getData().get(0);
    for (int i = 0; i < data.getScoreCount(); i++) {
        float score = data.getScores().get(i); // 相似度分?jǐn)?shù)(L2距離越小越相似)
        String text = data.getFields().get("text_content").get(i).toString(); // 文本內(nèi)容
        System.out.println((i+1) + ". 相似度:" + String.format("%.4f", score) + ",內(nèi)容:" + text);
    }
} else {
    System.out.println("? 查詢失?。? + searchResult.getMessage());
}

// 關(guān)閉客戶端
client.close();

這里有兩個(gè)關(guān)鍵知識點(diǎn):

  • 索引類型:IVF_FLAT 是 Milvus 最基礎(chǔ)的索引,適合小數(shù)據(jù)量(萬級以內(nèi)),優(yōu)點(diǎn)是查詢準(zhǔn)確、配置簡單;大數(shù)據(jù)量可選用 HNSW 等索引。
  • 相似度分?jǐn)?shù):我們用 L2 歐氏距離計(jì)算,分?jǐn)?shù)越小說明兩條數(shù)據(jù)的向量越接近,語義越相似。

四、運(yùn)行驗(yàn)證:5 分鐘看結(jié)果

點(diǎn)擊 IDEA 的運(yùn)行按鈕,等待程序執(zhí)行完成,控制臺會(huì)輸出完整的流程日志,最終會(huì)展示與“Java 線程相關(guān)問題”最相似的兩條數(shù)據(jù)。

由于我們用隨機(jī)數(shù)模擬向量,每次運(yùn)行的相似度分?jǐn)?shù)可能不同,但核心流程是通的。如果替換為真實(shí)的模型生成向量,就能得到符合語義的查詢結(jié)果。

五、進(jìn)階方向:從“能用”到“好用”

本次演示是最基礎(chǔ)的入門案例,實(shí)際開發(fā)中還需要關(guān)注這些點(diǎn):

  • 真實(shí)向量生成:引入 Sentence-BERT、ERNIE 等模型,Java 可使用 sentence-transformers 的 Java 封裝版,或通過 HTTP 調(diào)用模型服務(wù)(如 FastAPI 封裝的模型)。
  • 索引優(yōu)化:根據(jù)數(shù)據(jù)量選擇合適的索引(如百萬級數(shù)據(jù)用 HNSW),調(diào)整索引參數(shù)(如 nlist、nprobe)平衡查詢速度和準(zhǔn)確率。
  • 數(shù)據(jù)管理:添加數(shù)據(jù)刪除、更新、批量插入等操作,結(jié)合業(yè)務(wù)場景設(shè)計(jì)合理的集合結(jié)構(gòu)。
  • 分布式部署:生產(chǎn)環(huán)境用 Milvus 分布式版,而非 Lite 版,確保高可用和高并發(fā)。

六、總結(jié)

回顧整個(gè)流程,我們用 30 分鐘完成了 Java 連接向量數(shù)據(jù)庫的全流程:從環(huán)境配置、數(shù)據(jù)庫連接,到集合創(chuàng)建、數(shù)據(jù)插入,最終實(shí)現(xiàn)了相似度查詢。核心是掌握“向量是橋梁,集合是載體,索引是效率關(guān)鍵”這一邏輯。

向量數(shù)據(jù)庫的核心價(jià)值在于“理解語義”,它讓數(shù)據(jù)查詢從“精確匹配”升級為“語義聯(lián)想”。作為 Java 開發(fā)者,掌握這項(xiàng)技能能讓你在 AI 應(yīng)用開發(fā)中更有競爭力——無論是做智能客服、文檔檢索,還是推薦系統(tǒng),向量數(shù)據(jù)庫都是不可或缺的底層工具。

到此這篇關(guān)于30分鐘教你上手用Java快速搭建你的第一個(gè)向量數(shù)據(jù)庫的文章就介紹到這了,更多相關(guān)Java搭建向量數(shù)據(jù)庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于Java中代碼塊的執(zhí)行順序

    關(guān)于Java中代碼塊的執(zhí)行順序

    這篇文章主要介紹了關(guān)于Java中代碼塊的執(zhí)行順序,構(gòu)造代碼塊是給所有對象進(jìn)行統(tǒng)一初始化,而構(gòu)造函數(shù)是給對應(yīng)的對象初始化,因?yàn)闃?gòu)造函數(shù)是可以多個(gè)的,運(yùn)行哪個(gè)構(gòu)造函數(shù)就會(huì)建立什么樣的對象,但無論建立哪個(gè)對象,都會(huì)先執(zhí)行相同的構(gòu)造代碼塊,需要的朋友可以參考下
    2023-08-08
  • 面向切面的Spring通過切點(diǎn)來選擇連接點(diǎn)實(shí)例詳解

    面向切面的Spring通過切點(diǎn)來選擇連接點(diǎn)實(shí)例詳解

    這篇文章主要為大家介紹了面向切面的Spring通過切點(diǎn)來選擇連接點(diǎn)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • java之TreeUtils生成一切對象樹形結(jié)構(gòu)案例

    java之TreeUtils生成一切對象樹形結(jié)構(gòu)案例

    這篇文章主要介紹了java之TreeUtils生成一切對象樹形結(jié)構(gòu)案例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Spring如何通過注解引入外部資源(PropertySource?Value)

    Spring如何通過注解引入外部資源(PropertySource?Value)

    這篇文章主要為大家介紹了Spring通過注解@PropertySource和@Value引入外部資源的方法實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • MyBatis foreach 批量更新實(shí)例

    MyBatis foreach 批量更新實(shí)例

    這篇文章主要介紹了MyBatis foreach 批量更新實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 深入學(xué)習(xí)Java單元測試(Junit+Mock+代碼覆蓋率)

    深入學(xué)習(xí)Java單元測試(Junit+Mock+代碼覆蓋率)

    在做單元測試時(shí),代碼覆蓋率常常被拿來作為衡量測試好壞的指標(biāo),甚至,用代碼覆蓋率來考核測試任務(wù)完成情況,比如,代碼覆蓋率必須達(dá)到80%或 90%。下面我們就來詳細(xì)學(xué)習(xí)下java單元測試吧
    2019-06-06
  • Fluent Mybatis學(xué)習(xí)之Update語法實(shí)踐

    Fluent Mybatis學(xué)習(xí)之Update語法實(shí)踐

    Fluent MyBatis是一個(gè)MyBatis的增強(qiáng)工具,沒有對mybatis做任何修改。本篇文章將詳細(xì)介紹對Fluent Mybatis中的update語法進(jìn)行驗(yàn)證。代碼具有一定價(jià)值,感興趣的小伙伴可以學(xué)習(xí)一下
    2021-11-11
  • Java數(shù)據(jù)結(jié)構(gòu)順序表用法詳解

    Java數(shù)據(jù)結(jié)構(gòu)順序表用法詳解

    順序表是計(jì)算機(jī)內(nèi)存中以數(shù)組的形式保存的線性表,線性表的順序存儲是指用一組地址連續(xù)的存儲單元依次存儲線性表中的各個(gè)元素、使得線性表中在邏輯結(jié)構(gòu)上相鄰的數(shù)據(jù)元素存儲在相鄰的物理存儲單元中,即通過數(shù)據(jù)元素物理存儲的相鄰關(guān)系來反映數(shù)據(jù)元素之間邏輯上的相鄰關(guān)系
    2021-10-10
  • SpringBoot有外部依賴如何打運(yùn)行Jar包的問題

    SpringBoot有外部依賴如何打運(yùn)行Jar包的問題

    文章描述了如何將外部依賴導(dǎo)入本地Maven倉庫,并在pom文件中進(jìn)行配置,以及使用maven-assembly-plugin來打包Jar文件的方法,強(qiáng)調(diào)了在執(zhí)行命令時(shí)需要注意拼寫錯(cuò)誤,并保持pom文件中的配置與mvn?install命令一致,最后提到成功打包Jar文件,并確認(rèn)Jar可以正常運(yùn)行
    2025-10-10
  • Java全面解析XML格式串(JDOM解析)

    Java全面解析XML格式串(JDOM解析)

    下面小編就為大家?guī)硪黄狫ava全面解析XML格式串(JDOM解析)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06

最新評論

阜阳市| 东城区| 堆龙德庆县| 玉林市| 伊川县| 台前县| 金塔县| 浮山县| 辉南县| 肥乡县| 武川县| 山西省| 五指山市| 疏附县| 汾阳市| 六安市| 廉江市| 南川市| 贡觉县| 望城县| 宿迁市| 辽宁省| 塘沽区| 巧家县| 合山市| 蓬溪县| 从化市| 甘洛县| 昭觉县| 凌海市| 格尔木市| 纳雍县| 韶山市| 乾安县| 开江县| 夏邑县| 留坝县| 茂名市| 临夏县| 肥东县| 文山县|