diff --git a/app/Http/Controllers/ProgramAppendConstructController.php b/app/Http/Controllers/ProgramAppendConstructController.php
index 328f6f6..9372db6 100644
--- a/app/Http/Controllers/ProgramAppendConstructController.php
+++ b/app/Http/Controllers/ProgramAppendConstructController.php
@@ -60,11 +60,18 @@ class ProgramAppendConstructController extends BaseController
     }
 
     public function from_list(Request $request) {
-        $query = ProgramAppends::query()->groupBy("from")->select("from")->selectRaw("count(1) as total_count")->orderByDesc("total_count");
-        if ($request->has("value")) {
-            $keyword = $request->get("value");
-            $query->where("from", "like", "%{$keyword}%");
-        }
-        return $query->get()->toArray();
+        $query = ProgramAppends::query()->groupBy("from")
+            ->select("from")
+            ->selectRaw("count(1) as total_count")
+            ->having("total_count", ">", 1)
+            ->orderByDesc("total_count");
+        return $query->get()->map(function ($item) {
+            return [
+                "text" => $item["from"],
+                "value" => $item["from"],
+                "alias" => implode("", \pinyin($item["from"], PINYIN_NO_TONE)),
+                "abbr" => \pinyin_abbr($item["from"]),
+            ];
+        })->toArray();
     }
 }
diff --git a/composer.json b/composer.json
index e532b55..bac9e3b 100644
--- a/composer.json
+++ b/composer.json
@@ -6,14 +6,15 @@
     "license": "MIT",
     "require": {
         "php": "^7.3|^8.0",
+        "ext-json": "*",
         "fruitcake/laravel-cors": "^2.0",
         "guzzlehttp/guzzle": "^7.0.1",
         "laravel/framework": "^8.75",
         "laravel/sanctum": "^2.11",
         "laravel/tinker": "^2.5",
         "league/flysystem-aws-s3-v3": "~1.0",
-        "web-auth/webauthn-lib": "^3.3",
-        "ext-json": "*"
+        "overtrue/laravel-pinyin": "~4.0",
+        "web-auth/webauthn-lib": "^3.3"
     },
     "require-dev": {
         "facade/ignition": "^2.5",
diff --git a/composer.lock b/composer.lock
index 319dc6e..4070579 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "8591e794c9f0a98f4ee8696e4cb97b2d",
+    "content-hash": "6f048c3c6fc09674ba2be347f3a1682d",
     "packages": [
         {
             "name": "asm89/stack-cors",
@@ -2918,6 +2918,150 @@
             },
             "time": "2022-01-27T09:35:39+00:00"
         },
+        {
+            "name": "overtrue/laravel-pinyin",
+            "version": "4.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/overtrue/laravel-pinyin.git",
+                "reference": "c0b15aa49eac08bff80122010b91a0b3fe0f1e21"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/overtrue/laravel-pinyin/zipball/c0b15aa49eac08bff80122010b91a0b3fe0f1e21",
+                "reference": "c0b15aa49eac08bff80122010b91a0b3fe0f1e21",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "overtrue/pinyin": "~4.0"
+            },
+            "type": "library",
+            "extra": {
+                "laravel": {
+                    "providers": [
+                        "Overtrue\\LaravelPinyin\\ServiceProvider"
+                    ],
+                    "aliases": {
+                        "Pinyin": "Overtrue\\LaravelPinyin\\Facades\\Pinyin"
+                    }
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/helpers.php"
+                ],
+                "psr-4": {
+                    "Overtrue\\LaravelPinyin\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "overtrue",
+                    "email": "anzhengchao@gmail.com"
+                }
+            ],
+            "description": "Chinese to Pinyin translator.",
+            "keywords": [
+                "Chinese",
+                "Pinyin",
+                "laravel",
+                "overtrue"
+            ],
+            "support": {
+                "issues": "https://github.com/overtrue/laravel-pinyin/issues",
+                "source": "https://github.com/overtrue/laravel-pinyin/tree/master"
+            },
+            "time": "2018-10-10T09:02:46+00:00"
+        },
+        {
+            "name": "overtrue/pinyin",
+            "version": "4.0.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/overtrue/pinyin.git",
+                "reference": "04bdb4d33d50e8fb1aa5a824064c5151c4b15dc2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/overtrue/pinyin/zipball/04bdb4d33d50e8fb1aa5a824064c5151c4b15dc2",
+                "reference": "04bdb4d33d50e8fb1aa5a824064c5151c4b15dc2",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "require-dev": {
+                "brainmaestro/composer-git-hooks": "^2.7",
+                "friendsofphp/php-cs-fixer": "^2.16",
+                "phpunit/phpunit": "~8.0"
+            },
+            "type": "library",
+            "extra": {
+                "hooks": {
+                    "pre-commit": [
+                        "composer test",
+                        "composer fix-style"
+                    ],
+                    "pre-push": [
+                        "composer test",
+                        "composer check-style"
+                    ]
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/const.php"
+                ],
+                "psr-4": {
+                    "Overtrue\\Pinyin\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "overtrue",
+                    "email": "anzhengchao@gmail.com",
+                    "homepage": "http://github.com/overtrue"
+                }
+            ],
+            "description": "Chinese to pinyin translator.",
+            "homepage": "https://github.com/overtrue/pinyin",
+            "keywords": [
+                "Chinese",
+                "Pinyin",
+                "cn2pinyin"
+            ],
+            "support": {
+                "issues": "https://github.com/overtrue/pinyin/issues",
+                "source": "https://github.com/overtrue/pinyin/tree/4.0.8"
+            },
+            "funding": [
+                {
+                    "url": "https://www.patreon.com/overtrue",
+                    "type": "patreon"
+                }
+            ],
+            "time": "2021-07-19T03:43:32+00:00"
+        },
         {
             "name": "phpoption/phpoption",
             "version": "1.8.1",
@@ -10191,7 +10335,8 @@
     "prefer-stable": true,
     "prefer-lowest": false,
     "platform": {
-        "php": "^7.3|^8.0"
+        "php": "^7.3|^8.0",
+        "ext-json": "*"
     },
     "platform-dev": [],
     "plugin-api-version": "2.3.0"
diff --git a/resources/js/component/from_select.js b/resources/js/component/from_select.js
index 6acd453..41b5236 100644
--- a/resources/js/component/from_select.js
+++ b/resources/js/component/from_select.js
@@ -1,19 +1,28 @@
 import PickleComplate from "../vendor/picomplete/picomplete";
 
 (function () {
-    new PickleComplate({
-        request: {
-            url: '/programs/construct/append/from_list?',
-            type: 'GET',
-            value: 'from',
-            text: 'from',
-        },
-        config: {
-            type: 'server',
-            target: '#from_select',
-            clickCallback: (target, node) => {
-                target.value = node.value;
-            },
-        },
-    })
+    const pickle_config = {
+        target: '#from_select',
+        suggest: ["alias", "abbr"],
+        clickCallback: (target, node) => {
+            target.value = node.value;
+        }
+    };
+    let local_data_string = window.localStorage.getItem("append_from_list");
+    if (!local_data_string) {
+        return fetch("/programs/construct/append/from_list", {
+            "method": "GET",
+        }).then((response) => response.json()).then((data) => {
+            window.localStorage.setItem("append_from_list", JSON.stringify(data));
+            new PickleComplate({
+                data: data,
+                config: pickle_config,
+            })
+        });
+    } else {
+        new PickleComplate({
+            data: JSON.parse(local_data_string),
+            config: pickle_config,
+        })
+    }
 })()
diff --git a/resources/js/vendor/picomplete/picomplete.js b/resources/js/vendor/picomplete/picomplete.js
index c07b4a4..89aac98 100644
--- a/resources/js/vendor/picomplete/picomplete.js
+++ b/resources/js/vendor/picomplete/picomplete.js
@@ -96,7 +96,7 @@ export default class PickleComplate {
             this.sug_div = document.createElement('DIV');
             this.sug_div.classList.add('picomplete-items');
             for (let i = 0; i < this.container.length; i++) {
-                if (this.container[i].text.toLowerCase().includes(el.value.toLowerCase()) || this.container[i].value.toLowerCase().includes(el.value.toLowerCase())) {
+                if (this.containsSuggest(this.container[i], el.value)) {
                     //create list item
                     let item = document.createElement('DIV');
                     //set class
@@ -117,6 +117,23 @@ export default class PickleComplate {
         if(this.sug_div !== null) this.element.parentNode.appendChild(this.sug_div);
     }
 
+    containsSuggest(item, value) {
+        if (item.text.toLowerCase().includes(value.toLowerCase()) ||
+            item.value.toLowerCase().includes(value.toLowerCase())) {
+            return true;
+        }
+        if (this.config.suggest) {
+            if (typeof this.config.suggest === "string") {
+                this.config.suggest = [this.config.suggest]
+            }
+            for (const suggest_key of this.config.suggest) {
+                if (item.hasOwnProperty(suggest_key) && item[suggest_key].toLowerCase().includes(value.toLowerCase())) {
+                    return true;
+                }
+            }
+        }
+    }
+
 
 
     /**