{"id":19886,"date":"2025-12-29T07:00:00","date_gmt":"2025-12-28T22:00:00","guid":{"rendered":"https:\/\/blog.capilano-fw.com\/?p=19886"},"modified":"2025-12-30T23:43:34","modified_gmt":"2025-12-30T14:43:34","slug":"%e3%83%99%e3%82%af%e3%83%88%e3%83%abdb-%e3%83%ad%e3%83%bc%e3%82%ab%e3%83%abllm%e3%81%a7%e8%a6%8b%e7%a9%8d%e6%9b%b8%e3%81%ae%e3%81%82%e3%81%84%e3%81%be%e3%81%84%e6%a4%9c%e7%b4%a2%e3%82%92%e3%81%a4","status":"publish","type":"post","link":"https:\/\/blog.capilano-fw.com\/?p=19886","title":{"rendered":"\u30d9\u30af\u30c8\u30ebDB + \u30ed\u30fc\u30ab\u30ebLLM\u3067\u898b\u7a4d\u66f8\u306e\u3042\u3044\u307e\u3044\u691c\u7d22\u3092\u3064\u304f\u3063\u3066\u307f\u305f\uff01"},"content":{"rendered":"\n<p>\u3055\u3066\u3055\u3066\u3001\u5b9f\u306f\u524d\u56de\u8a18\u4e8b\u300c<a href=\"https:\/\/blog.capilano-fw.com\/?p=19631\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>\u793e\u5916\u79d8\u30c7\u30fc\u30bf\u3082\u4f7f\u3048\u308b\u751f\u6210AI\u3002Ollama\u3067Linux\u30b3\u30de\u30f3\u30c9\u63d0\u6848\u30c4\u30fc\u30eb\u3092\u3064\u304f\u3063\u3066\u307f\u305f\uff01<\/strong><\/a>\u300d\u3067\u304a\u8a71\u3092\u4f3a\u3063\u305f\u793e\u9577\u3055\u3093\u304b\u3089\u3082\u30461\u3064\u9762\u767d\u305d\u3046\u306a\u30ad\u30fc\u30ef\u30fc\u30c9\u3092\u6559\u3048\u3066\u3082\u3089\u305f\u3093\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u305d\u308c\u304c\u30fb\u30fb\u30fb\u30fb\u30fb\u30fb<\/p>\n\n\n\n<p class=\"has-large-font-size\"><strong>\u30d9\u30af\u30c8\u30ebDB<\/strong><\/p>\n\n\n\n<p>\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u30d9\u30af\u30c8\u30ebDB\u3068\u306f\u3001\u901a\u5e38DB\u3068\u306f\u9055\u3063\u3066\u3001\u610f\u5473\u3092\u6570\u5024\u5316\u3057\u3066\u4fdd\u5b58\u3059\u308b\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3067\u3059\u3002\u305d\u3057\u3066\u3001\u305d\u306e\u6570\u5024\uff08\u30d9\u30af\u30c8\u30eb\uff09\u3067\u691c\u7d22\u3059\u308b\u305f\u3081\u3001\u3042\u3044\u307e\u3044\u306a\u6761\u4ef6\u3067\u3082\u7279\u5b9a\u306e\u30c7\u30fc\u30bf\u3092\u63a2\u3059\u3053\u3068\u304c\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u305d\u3057\u3066\u3001\u306a\u305c\u305d\u306e\u793e\u9577\u3055\u3093\u304c\u30d9\u30af\u30c8\u30ebDB\u306b\u6ce8\u76ee\u3057\u3066\u3044\u308b\u304b\u3068\u3044\u3046\u3068\u3001<\/p>\n\n\n\n<p class=\"has-large-font-size\"><strong>\u5927\u4f01\u696d\u306f\u300c\u3042\u306e\u30d5\u30a1\u30a4\u30eb\u3069\u3053\u3060\u3063\u3051\uff1f\u300d\u3067\u6642\u9593\u304c\u304b\u304b\u308a\u3059\u304e\u308b<\/strong><\/p>\n\n\n\n<p>\u304b\u3089\u89e3\u6c7a\u3067\u304d\u308b\u306e\u3067\u306f\u3001\u3068\u8003\u3048\u3066\u3044\u308b\u304b\u3089\u3068\u306e\u3053\u3068\u3067\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u3064\u307e\u308a\u3001<code>ChatGPT<\/code>\u306e\u3088\u3046\u306b\u81ea\u7136\u8a00\u8a9e\u3092\u3064\u304b\u3063\u3066\u3001\u305f\u3068\u3048\u3070\u3001<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u6765\u6708\u51fa\u3059\u306e\u306b\u9069\u5207\u306a\u5831\u544a\u66f8\u304c\u3069\u308c\uff1f<\/li>\n\n\n\n<li>1\u5e74\u524d\u3082\u3089\u3063\u305f\u306e\u898b\u7a4d\u66f8\u306f\u3069\u308c\uff1f<\/li>\n\n\n\n<li>\u8b70\u4e8b\u9332\u306e\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u306f\u3069\u308c\u304c\u9069\u5207\uff1f<\/li>\n<\/ul>\n\n\n\n<p>\u3068\u3044\u3046\u3088\u3046\u306a\u30d5\u30a1\u30a4\u30eb\u691c\u7d22\u306b\u3064\u304b\u3048\u305f\u3089\u3001\u3068\u306e\u3053\u3068\u3067\u3057\u305f\uff08\u9762\u767d\u3044\u8996\u70b9\u3067\u3059\u3088\u306d\ud83d\ude0a\uff09<\/p>\n\n\n\n<p>\u305d\u3053\u3067\uff01<\/p>\n\n\n\n<p>\uff08\u4e0d\u52c9\u5f37\u306a\u304c\u3089\uff09\u30d9\u30af\u30c8\u30ebDB\u306f\u307e\u3063\u305f\u304f\u77e5\u3089\u306a\u304b\u3063\u305f\u306e\u3067\u3001\u524d\u56de\u8a18\u4e8b\u3067\u3064\u304b\u3063\u305f<code>Ollama<\/code>\uff08\u30ed\u30fc\u30ab\u30ebLLM\uff09\u3092\u3064\u304b\u3063\u3066\u3001\u300c<strong>\u30aa\u30d5\u30e9\u30a4\u30f3\u3067\u5b8c\u7d50\u3059\u308b\uff08=\u793e\u5916\u79d8\u30c7\u30fc\u30bfOK\u306a\uff09<\/strong>\u300d\u30d5\u30a1\u30a4\u30eb\u306e\u3042\u3044\u307e\u3044\u691c\u7d22\u3092\u3064\u304f\u3063\u3066\u307f\u307e\u3057\u305f\uff01<\/p>\n\n\n\n<p>\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u65b9\u306b\u5411\u3051\u3066\u66f8\u3044\u3066\u3044\u307e\u3059\u3002<br>\u305c\u3072\u6700\u5f8c\u307e\u3067\u8aad\u3093\u3067\u304f\u3060\u3055\u3044\u306d\uff01<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u300c\u793e\u5916\u79d8\u30c7\u30fc\u30bf\u3092\u751f\u6210AI\u3067\u3064\u304b\u3044\u305f\u3044\u300d<\/li>\n\n\n\n<li>\u300c\u30af\u30e9\u30a6\u30c9\u306b\u4e0a\u3052\u3089\u308c\u306a\u3044\u9867\u5ba2\u30c7\u30fc\u30bf\u3092\u5b89\u5168\u306b\u691c\u7d22\u30fb\u8981\u7d04\u3055\u305b\u305f\u3044\u300d<\/li>\n\n\n\n<li>\u300c\u53d6\u5f15\u5148\u3068\u306e\u5951\u7d04\u66f8\u3092\u3001\u90e8\u7f72\u6a2a\u65ad\u3067\u4e00\u77ac\u3067\u691c\u7d22\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u305f\u3044\u300d<\/li>\n\n\n\n<li>\u300c\u904e\u53bb\u306e\u7a1f\u8b70\u66f8\u30fb\u4f01\u753b\u66f8\u304b\u3089\u4f3c\u305f\u4e8b\u4f8b\u3092\u3059\u3050\u5f15\u3063\u5f35\u308a\u51fa\u3057\u305f\u3044\u300d<\/li>\n\n\n\n<li>\u300c\u5c5e\u4eba\u6027\u3092\u306a\u304f\u3057\u3066\u3001\u300e\u3042\u306e\u4eba\u3057\u304b\u77e5\u3089\u306a\u3044\u300f\u3092\u306a\u304f\u3057\u305f\u3044\u300d<\/li>\n\n\n\n<li>\u300c\u9000\u8077\u3057\u305f\u4eba\u306e\u30d5\u30a9\u30eb\u30c0\u306e\u4e2d\u8eab\u3082\u691c\u7d22\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u305f\u3044\u300d<\/li>\n\n\n\n<li>\u300c\u3068\u306b\u304b\u304f\u3001AI\u306e\u6d41\u308c\u3092\u9003\u3057\u305f\u304f\u306a\u3044\uff01\u300d<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"310\" height=\"320\" src=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2024\/07\/no_7.png\" alt=\"\" class=\"wp-image-12948\" srcset=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2024\/07\/no_7.png 310w, https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2024\/07\/no_7-291x300.png 291w\" sizes=\"auto, (max-width: 310px) 100vw, 310px\" \/><\/figure><\/div>\n\n\n<p class=\"has-text-align-center\">\u300c\u4eca\u5e74\u3082\u65e9\u304b\u3063\u305f\u3002<br>\u3069\u3046\u305b\u307e\u305f\u300e\u3048\uff01\u5f8c3\u65e5\u30672026\u5e74\u3082\u304a\u308f\u308a\uff01\uff1f\u300f<br>\u3066\u306a\u308b\u3093\u3067\u3057\u3087\u3046\u306d\ud83d\ude02\u300d<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u524d\u63d0\u3068\u3057\u3066<\/h2>\n\n\n\n<p>\u30b5\u30fc\u30d0\u30fc\u3067\u5b9f\u884c\u3059\u308b\u3053\u3068\u3092\u524d\u63d0\u3068\u3057\u3066\u3044\u308b\u306e\u3067\u3001\u4eca\u56de\u306f\u5b9f\u88c5\u74b0\u5883\u306f<code>Ubuntu<\/code>\uff08<code>Linux<\/code>\uff09\u306b\u306a\u308a\u307e\u3059\u3002\u305f\u3060\u3057\u3001\u6280\u8853\u7684\u306b\u306f<code>windows<\/code>\u3084<code>macOS<\/code>\u3067\u3082\u3044\u3051\u308b\u3068\u601d\u3046\u306e\u3067\u3001\u305c\u3072\u53c2\u8003\u306b\u3057\u3066\u304f\u3060\u3055\u3044\uff01<\/p>\n\n\n\n<p>\u3061\u306a\u307f\u306b\u3001\u30ed\u30fc\u30ab\u30eb\u3067\u5b9f\u88c5\u3059\u308b\u306a\u3089\u57fa\u672c\u7684\u306b\u306f\u3059\u3079\u3066\u7121\u6599\u3067\u3044\u3051\u307e\u3059\u3088\ud83d\udc4d<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u5fc5\u8981\u306a\u30c6\u30af\u30ce\u30ed\u30b8\u30fc\u3092\u6e96\u5099\u3059\u308b<\/h2>\n\n\n\n<p>\u4eca\u56de\u306e\u300c\u3042\u3044\u307e\u3044\u691c\u7d22\u300d\u3092\u5b9f\u88c5\u3059\u308b\u306b\u306f\u3001\u4ee5\u4e0b5\u3064\u306e\u30c6\u30af\u30ce\u30ed\u30b8\u30fc\u304c\u5fc5\u8981\u3067\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ollama\uff1a\u30ed\u30fc\u30ab\u30ebLLM\uff08\u30ed\u30fc\u30ab\u30eb\u3067\u52d5\u304fAI\uff09<\/li>\n\n\n\n<li>Qdrant\uff1a\u30d9\u30af\u30c8\u30ebDB\uff08\u30c7\u30fc\u30bf\u3092\u6570\u5024\u3067\u7ba1\u7406\u3059\u308b\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\uff09<\/li>\n\n\n\n<li>PDF to Text\uff1a\u753b\u50cf\u304b\u3089\u30c6\u30ad\u30b9\u30c8\u3092\u62bd\u51fa\u3059\u308bOCR<\/li>\n\n\n\n<li>MySQL\uff1a\u901a\u5e38\u306eDB\uff08\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u306f\u5272\u611b\uff09<\/li>\n\n\n\n<li>\u30a6\u30a7\u30d6\u958b\u767a\uff1aLaravel\u3084Vue\u306a\u3069\uff08\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u306f\u5272\u611b\uff09<\/li>\n<\/ul>\n\n\n\n<p>\u305d\u308c\u305e\u308c\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3066\u304a\u304d\u307e\u3057\u3087\u3046\uff01<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Ollama\uff08\u30ed\u30fc\u30ab\u30ebLLM\uff09\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b<\/h3>\n\n\n\n<p>\u524d\u56de\u8a18\u4e8b\u300c<a href=\"https:\/\/blog.capilano-fw.com\/?p=19886\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>\u30d9\u30af\u30c8\u30ebDB + \u30ed\u30fc\u30ab\u30ebLLM\u3067\u898b\u7a4d\u66f8\u306e\u3042\u3044\u307e\u3044\u691c\u7d22\u3092\u3064\u304f\u3063\u3066\u307f\u305f\uff01<\/strong><\/a>\u300d\u3067\u306f\u3001<code>gemma2:2b<\/code>\u3068\u3044\u3046\u30e2\u30c7\u30eb\u3092\u4f7f\u3044\u307e\u3057\u305f\u304c\u3001\u4eca\u56de\u306f\u30d9\u30af\u30c8\u30eb\u5316\u5c02\u7528\u306e\u30e2\u30c7\u30eb\u300c<strong>embeddinggemma:300m<\/strong>\u300d\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"has-small-font-size\">\u203b\u3069\u3046\u3084\u3089EmbeddingGemma\u306f\u3001Google\u304c\u63d0\u4f9b\u3057\u3066\u308b\u3088\u3046\u3067\u3059\u306d\ud83e\udd14<\/p>\n\n\n\n<p>\u4ee5\u4e0b\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-verse\"><strong>ollama pull embeddinggemma:300m<\/strong><\/pre>\n\n\n\n<p>\u3053\u308c\u3067\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u306f\u5b8c\u4e86\u3067\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Qdrant\uff08\u30d9\u30af\u30c8\u30ebDB\uff09\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b<\/h3>\n\n\n\n<p><code>docker<\/code>\u304c\u3064\u304b\u3048\u308b\u306e\u3067\u3001\u4ee5\u4e0b\u30b3\u30de\u30f3\u30c9\u3067\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"has-small-font-size\">\u203b\u3061\u306a\u307f\u306b\u3067\u3059\u304c\u3001\u8aad\u307f\u65b9\u306f\u300c\u30af\u30ef\u30c9\u30e9\u30f3\u30c8\u300d\u3060\u305d\u3046\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-verse\"><strong>docker pull qdrant\/qdrant<\/strong><\/pre>\n\n\n\n<p>\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u304c\u5b8c\u4e86\u3057\u305f\u3089\u3001\u4ee5\u4e0b\u30b3\u30de\u30f3\u30c9\u3067\u8d77\u52d5\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-verse\"><strong>docker run -p 6333:6333 -v $(pwd)\/qdrant_storage:\/qdrant\/storage qdrant\/qdrant<\/strong><\/pre>\n\n\n\n<p>\u3053\u306e\u72b6\u614b\u3067\u300c<strong>http:\/\/localhost:6333\/<\/strong>\u300d\u304c\u6709\u52b9\u306b\u306a\u3063\u3066\u308b\u306e\u3067\u3001\u30d6\u30e9\u30a6\u30b6\u304b\u3089\u30a2\u30af\u30bb\u30b9\u3067\u304d\u307e\u3059\uff01\u4e00\u5ea6\u898b\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-full image-border-3\"><img loading=\"lazy\" decoding=\"async\" width=\"527\" height=\"63\" src=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2025\/12\/ollama-qdrant-fuzzy-search-1.png\" alt=\"\" class=\"wp-image-19921\" srcset=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2025\/12\/ollama-qdrant-fuzzy-search-1.png 527w, https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2025\/12\/ollama-qdrant-fuzzy-search-1-300x36.png 300w\" sizes=\"auto, (max-width: 527px) 100vw, 527px\" \/><\/figure>\n\n\n\n<p>\u5f8c\u3067\u7d39\u4ecb\u3057\u307e\u3059\u304c\u3001\u30c7\u30fc\u30bf\u306e\u4fdd\u5b58&amp;\u691c\u7d22\u306f\u3053\u306e<code>URL<\/code>\u3092\u4f7f\u3046\u3053\u3068\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3067\u306f\u3001\u666e\u901a\u306eDB\u306e\u30c6\u30fc\u30d6\u30eb\u306b\u3042\u305f\u308b\u300c\u30b3\u30ec\u30af\u30b7\u30e7\u30f3\u300d\u3092\u300c<strong>estimate_documents<\/strong>\u300d\u3068\u3044\u3046\u540d\u524d\u3067\u3064\u304f\u3063\u3066\u304a\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-verse\"><strong>curl -X PUT \"http:\/\/localhost:6333\/collections\/estimate_documents\" \\<br>  -H 'Content-Type: application\/json' \\<br>  -d '{<br>    \"vectors\": {<br>      \"size\": 768,<br>      \"distance\": \"Cosine\"<br>    }<br>  }'<\/strong><\/pre>\n\n\n\n<p>\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u8fd4\u3063\u3066\u304f\u308c\u3070\u6210\u529f\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-verse\"><strong>{\"result\":true,\"status\":\"ok\",\"time\":0.041063127}<\/strong><\/pre>\n\n\n\n<p>\u3067\u306f\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u304c\u3042\u308b\u306e\u3067\u3001\u300c<strong>http:\/\/localhost:6333\/dashboard#\/collections<\/strong>\u300d\u306b\u30a2\u30af\u30bb\u30b9\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-full image-border-3\" id=\"image-border-3\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"340\" src=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2025\/12\/ollama-qdrant-fuzzy-search-4.png\" alt=\"\" class=\"wp-image-20008\" srcset=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2025\/12\/ollama-qdrant-fuzzy-search-4.png 640w, https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2025\/12\/ollama-qdrant-fuzzy-search-4-300x159.png 300w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/figure>\n\n\n\n<p>\u3053\u3093\u306a\u611f\u3058\u3067\u8868\u793a\u3055\u308c\u3066\u3044\u308c\u3070\u6210\u529f\u3067\u3059\uff01<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u5b9f\u88c5\u3059\u308b\u6d41\u308c<\/h2>\n\n\n\n<p>\u3044\u304f\u3064\u304b\u5fc5\u8981\u306a\u30c6\u30af\u30ce\u30ed\u30b8\u30fc\u304c\u3042\u308b\u306e\u3067\u3001\u3053\u3053\u3067\u3069\u3093\u306a\u6d41\u308c\u3067\u300c\u3042\u3044\u307e\u3044\u691c\u7d22\u300d\u3059\u308b\u304b\u307e\u3068\u3081\u3066\u304a\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<p>\u307e\u305a\u3001\u624b\u9806\u3068\u3057\u3066\u306f\u3001<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u3042\u3044\u307e\u3044\u691c\u7d22\u3057\u305f\u3044\u898b\u7a4d\u3082\u308aPDF\u3092\u7528\u610f\u3059\u308b<\/li>\n\n\n\n<li>pdf\u306e\u30d5\u30a1\u30a4\u30eb\u540d\u306a\u3069\u3092MySQL\u3078\u4fdd\u5b58<\/li>\n\n\n\n<li>PDF\u304b\u3089\u30c6\u30ad\u30b9\u30c8\u3092\u62bd\u51fa\u3057\u3001Ollama\u3067\u6574\u5f62&amp;\u30d9\u30af\u30c8\u30eb\u5316<\/li>\n\n\n\n<li>Qdrant\u306b3\u306e\u30d9\u30af\u30c8\u30eb\u30c7\u30fc\u30bf&amp;\u8ffd\u52a0\u60c5\u5831\u3068\u3057\u30662\u306eid\u3092\u4e00\u7dd2\u306b\u4fdd\u5b58<\/li>\n<\/ol>\n\n\n\n<p>\u6b21\u306b\u691c\u7d22\u306e\u5834\u5408\u306f\u3001<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u691c\u7d22\u3057\u305f\u3044\u30ad\u30fc\u30ef\u30fc\u30c9\u3092\u7528\u610f<\/li>\n\n\n\n<li>Ollama\u3092\u4f7f\u3063\u3066\u30ad\u30fc\u30ef\u30fc\u30c9\u3092\u30d9\u30af\u30c8\u30eb\u5316<\/li>\n\n\n\n<li>Qdrant\u3067\u691c\u7d22\u3057\u3066\u3001\u8ffd\u52a0\u60c5\u5831\u306e\uff08MySQL\u3067\u3064\u304b\u3046\uff09ID\u3092\u53d6\u5f97<\/li>\n\n\n\n<li>\u305d\u306eID\u3092\u3064\u304b\u3063\u3066MySQL\u304b\u3089\u30c7\u30fc\u30bf\u53d6\u5f97<\/li>\n\n\n\n<li>\u30e6\u30fc\u30b6\u30fc\u306b\u8868\u793a\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3067\u306f\u3001\u3053\u3053\u304b\u3089\u306f<code>Laravel<\/code>\u3067\u5b9f\u88c5\u3057\u3066\u3044\u304d\u307e\u3057\u3087\u3046\uff01<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Laravel\u306e\u90e8\u5206\u3092\u3064\u304f\u308b<\/h2>\n\n\n\n<p>\u3053\u3053\u304b\u3089\u30a6\u30a7\u30d6\u30a2\u30d7\u30ea\u3092\u3064\u304f\u3063\u3066\u3044\u304d\u307e\u3059\u3002<br>\u5b9f\u969b\u306e\u30b3\u30fc\u30c9\u306f\u3053\u3061\u3089\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"has-small-font-size\">\u203b\u5404\u89e3\u8aac\u306f\u7701\u7565\u3057\u307e\u3059\u304c\u3001\u3082\u3057\u308f\u304b\u3089\u306a\u3044\u3068\u3053\u308d\u304c\u3042\u308c\u304c\u3001<a href=\"https:\/\/chatgpt.com\/?q=%E4%BB%A5%E4%B8%8B%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%84%8F%E5%91%B3%E3%82%92%E3%82%8F%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%8F%E8%A7%A3%E8%AA%AC%E3%81%97%E3%81%A6%0D%0A%EF%BC%88%E3%81%93%E3%81%93%E3%81%AB%E3%82%B3%E3%83%BC%E3%83%89%EF%BC%89\">\u3053\u3061\u3089<\/a>\u304b\u3089ChatGPT\u306b\u3067\u3082\u805e\u3044\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<p><strong>routes\/web.php<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>use App\\Http\\Controllers\\FuzzySearchController;<br><br>Route::<em>prefix<\/em>('fuzzy-search')-&gt;group(function () {<br>    Route::<em>get<\/em>('\/', [FuzzySearchController::class, 'index'])-&gt;name('fuzzy-search.index');<br>    Route::<em>get<\/em>('\/create', [FuzzySearchController::class, 'create'])-&gt;name('fuzzy-search.create');<br>    Route::<em>post<\/em>('\/', [FuzzySearchController::class, 'store'])-&gt;name('fuzzy-search.store');<br>});<\/strong><\/pre>\n\n\n\n<p><strong>app\/Http\/Controllers\/FuzzySearchController.php<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>&lt;?php<br><br>namespace App\\Http\\Controllers;<br><br>use Illuminate\\Http\\Request;<br>use Illuminate\\Support\\Facades\\Storage;<br>use App\\Models\\EstimateDocument;<br>use Illuminate\\Support\\Facades\\Http;<br><br>class FuzzySearchController extends Controller<br>{<br>    public function index(Request $request)<br>    {<br>        $keyword = $request-&gt;query('q', '');<br>        $results = [];<br><br>        if ($request-&gt;filled('q')) {<br>            $embedding = $this-&gt;getEmbeddingFromOllama($keyword);<br>            if (is_array($embedding) &amp;&amp; count($embedding)) {<br>                try {<br>                    $url = 'http:\/\/127.0.0.1:6333\/collections\/estimate_documents\/points\/search';<br>                    $response = Http::<em>timeout<\/em>(10)-&gt;post($url, [<br>                        'vector' =&gt; $embedding,<br>                        'limit' =&gt; 10,<br>\/\/                        'score_threshold' =&gt; 0.7, \/\/ \u3053\u306e\u30b9\u30b3\u30a2\uff08\u985e\u4f3c\u5ea6\uff09\u4ee5\u4e0a\u306e\u3082\u306e\u3060\u3051\u8fd4\u3059\u3002\u3067\u3082\u30c6\u30b9\u30c8\u306a\u306e\u3067\u30b3\u30e1\u30f3\u30c8\u30a2\u30a6\u30c8<br>                        'with_payload' =&gt; true,<br>                    ]);<br><br>                    if ($response-&gt;ok()) {<br>                        $body = $response-&gt;json();<br>                        $vectorItems = $body['result'] ?? [];<br>                        $vectorCollection = collect($vectorItems);<br>                        $estimateDocumentIds = $vectorCollection-&gt;pluck('id')-&gt;toArray();<br>                        $estimateDocuments = EstimateDocument::<em>whereIn<\/em>('id', $estimateDocumentIds)-&gt;get();<br><br>                        \/\/ \u30d2\u30c3\u30c8\u9806\u306b\u7d50\u679c\u3092\u4f5c\u308b\uff08score\u3092\u4ed8\u4e0e\uff09<br>                        foreach ($estimateDocumentIds as $estimateDocumentId) {<br>                            $estimateDocument = $estimateDocuments-&gt;firstWhere('id', $estimateDocumentId);<br>                            if(! is_null($estimateDocument)) {<br>                                $results[] = [<br>                                    'id' =&gt; $estimateDocument-&gt;id,<br>                                    'filename' =&gt; $estimateDocument-&gt;filename,<br>                                    'original_filename' =&gt; $estimateDocument-&gt;original_filename,<br>                                    'path' =&gt; $estimateDocument-&gt;path,<br>                                    'score' =&gt; $vectorCollection-&gt;firstWhere('id', $estimateDocumentId)['score'],<br>                                ];<br>                            }<br>                        }<br>                    }<br>                } catch (\\Exception $e) {<br>                    throw $e;<br>                }<br>            }<br>        }<br><br>        return inertia('FuzzySearch\/Index', [<br>            'q' =&gt; $keyword,<br>            'estimateDocuments' =&gt; $results,<br>        ]);<br>    }<br><br>    public function create(Request $request)<br>    {<br>        $success = $request-&gt;session()-&gt;get('success');<br><br>        return inertia('FuzzySearch\/Create', [<br>            'flash' =&gt; $success,<br>        ]);<br>    }<br><br>    public function store(Request $request)<br>    {<br>        \/\/ \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3084\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u306f\u7701\u7565\u3057\u3066\u3044\u307e\u3059<br><br>        $file = $request-&gt;file('pdf');<br>        $path = $file-&gt;store('public\/estimates');<br>        $filename = basename($path);<br><br>        \/\/ 1. MySQL\u306b\u30d5\u30a1\u30a4\u30eb\u540d &amp; \u5143\u306e\u30d5\u30a1\u30a4\u30eb\u540d\u3092\u4fdd\u5b58<br>        $doc = $this-&gt;saveEstimateDocument($filename, $file-&gt;getClientOriginalName());<br><br>        \/\/ 2. PDF\u304b\u3089\u30c6\u30ad\u30b9\u30c8\u3092\u62bd\u51fa<br>        $localPdf = Storage::<em>path<\/em>($path);<br>        $extractedText = $this-&gt;extractPdfText($localPdf);<br><br>        \/\/ 3. \u30c6\u30ad\u30b9\u30c8\u3092\u30d9\u30af\u30c8\u30eb\u5316<br>        $embedding = $this-&gt;getEmbeddingFromOllama($extractedText);<br><br>        \/\/ 4. Qdrant\u3078\u4fdd\u5b58<br>        if (is_array($embedding) &amp;&amp; count($embedding)) {<br>            $this-&gt;saveEmbeddingToQdrant($doc, $embedding);<br>        }<br><br>        return redirect()-&gt;route('fuzzy-search.create')-&gt;with('success', '\u51e6\u7406\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f\u3002');<br>    }<br><br>    private function saveEstimateDocument(string $filename, string $originalFilename): EstimateDocument<br>    {<br>        return EstimateDocument::<em>create<\/em>([<br>            'filename' =&gt; $filename,<br>            'original_filename' =&gt; $originalFilename,<br>        ]);<br>    }<br><br>    <em>\/**<br>     * Ollama\u306eAPI\u306b\u554f\u3044\u5408\u308f\u305b\u3092\u884c\u3046<br>     *\/<br>    <\/em>private function askOllama(string $prompt): ?array<br>    {<br>        try {<br><br>            $url = 'http:\/\/127.0.0.1:11434\/api\/generate';<br>            $response = Http::<em>timeout<\/em>(10)-&gt;post($url, [<br>                'model' =&gt; 'gemma2:2b',<br>                'stream' =&gt; false,<br>                'prompt' =&gt; $prompt,<br>            ]);<br><br>            return $response-&gt;json();<br><br>        } catch (\\Exception $e) {<br><br>            throw $e;<br><br>        }<br>    }<br><br>    <em>\/**<br>     * pdftotext\u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u3063\u3066PDF\u304b\u3089\u30c6\u30ad\u30b9\u30c8\u3092\u62bd\u51fa\u3059\u308b<br>     *\/<br>    <\/em>private function extractPdfText(string $localPdf): string<br>    {<br>        $commands = [<br>            sprintf('pdftotext -layout -enc UTF-8 %s -', escapeshellarg($localPdf)),<br>            sprintf('pdftotext -layout %s -', escapeshellarg($localPdf)),<br>            sprintf('pdftotext %s -', escapeshellarg($localPdf)),<br>        ];<br><br>        foreach ($commands as $command) {<br>            $out = [];<br>            $ret = 1;<br>            exec($command, $out, $ret);<br>            if ($ret === 0) { \/\/ \u6210\u529f\u3057\u305f\u3089\u8fd4\u3059<br>                $prompt = \"\u3053\u308c\u306f\u898b\u7a4d\u66f8\u30c6\u30ad\u30b9\u30c8\u3067\u3059\u3002\u660e\u7d30\u884c\u306e\u54c1\u540d\u3060\u3051\u629c\u304d\u51fa\u3057\u3001\u914d\u5217\u3068\u3057\u3066JSON\u3060\u3051\u3067\u51fa\u529b\u3057\u3066\u304f\u3060\u3055\u3044\\n\\n\" . implode(\"\\n\", $out);<br>                $answer = $this-&gt;askOllama($prompt);<br>                $text = $answer['response'] ?? '';<br><br>                $start = strpos($text, '[');<br>                $end   = strrpos($text, ']');<br><br>                if ($start === false || $end === false || $end &lt; $start) {<br><br>                    throw new \\RuntimeException('JSON \u914d\u5217\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002');<br><br>                }<br><br>                $json = substr($text, $start, $end - $start + 1);<br>                $data = json_decode($json, true);<br><br>                if (json_last_error() !== <em>JSON_ERROR_NONE<\/em>) {<br>                    throw new \\RuntimeException('JSON \u30c7\u30b3\u30fc\u30c9\u5931\u6557: ' . json_last_error_msg());<br>                }<br><br>                return implode(\"\\n\", $data);<br>            }<br>        }<br><br>        return '';<br>    }<br><br>    <em>\/**<br>     * Ollama\u306eAPI\u3092\u4f7f\u3063\u3066\u3001\u57cb\u3081\u8fbc\u307f\u30d9\u30af\u30c8\u30eb\u3092\u53d6\u5f97\u3059\u308b<br>     *\/<br>    <\/em>private function getEmbeddingFromOllama(string $text): ?array<br>    {<br>        if (trim($text) === '') {<br>            return null;<br>        }<br><br>        try {<br>            $url = 'http:\/\/127.0.0.1:11434\/api\/embed';<br>            $response = Http::<em>timeout<\/em>(10)-&gt;post($url, [<br>                'model' =&gt; 'embeddinggemma:300m',<br>                'input' =&gt; $text,<br>            ]);<br><br>            if (! $response-&gt;ok()) {<br>                return null;<br>            }<br><br>            $body = $response-&gt;json();<br>            return data_get($body, 'embeddings.0');<br>        } catch (\\Exception $e) {<br>            return null;<br>        }<br>    }<br><br>    private function saveEmbeddingToQdrant(EstimateDocument $doc, array $embedding): void<br>    {<br>        try {<br>            $url = 'http:\/\/127.0.0.1:6333';<br>            $point = [<br>                'id' =&gt; $doc-&gt;id,<br>                'vector' =&gt; $embedding,<br>                'payload' =&gt; [<br>                    'estimate_id' =&gt; $doc-&gt;id,<br>                ],<br>            ];<br><br>            Http::<em>put<\/em>(<br>                $url . '\/collections\/estimate_documents\/points?wait=true',<br>                [<br>                    'points' =&gt; [$point],<br>                ]<br>            );<br>        } catch (\\Exception $e) {<br>            throw $e;<br>        }<br>    }<br>}<\/strong><\/pre>\n\n\n\n<p><strong>resources\/js\/Pages\/FuzzySearch\/Index.vue<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>&lt;template&gt;<br>    &lt;Head title=\"\u898b\u7a4d\u66f8 \u3042\u3044\u307e\u3044\u691c\u7d22\" \/&gt;<br><br>    &lt;div class=\"mx-auto max-w-3xl p-6\"&gt;<br>        &lt;h1 class=\"mb-4 text-2xl font-semibold\"&gt;\u898b\u7a4d\u66f8\u3092\u81ea\u7136\u8a00\u8a9e\u3067\u3042\u3044\u307e\u3044\u691c\u7d22&lt;\/h1&gt;<br><br>        &lt;form @submit.prevent=\"onSubmit\" class=\"mb-4 flex\"&gt;<br>            &lt;input<br>                v-model=\"form.q\"<br>                type=\"text\"<br>                placeholder=\"\u691c\u7d22\u8a9e\u3092\u5165\u529b\"<br>                class=\"flex-1 rounded-l border p-2\"<br>            \/&gt;<br>            &lt;button<br>                type=\"submit\"<br>                :disabled=\"loading\"<br>                class=\"rounded-r bg-indigo-600 px-4 py-2 text-white disabled:opacity-60\"<br>            &gt;<br>                &lt;span&gt;{{ loading ? '\u691c\u7d22\u4e2d...' : '\u691c\u7d22' }}&lt;\/span&gt;<br>            &lt;\/button&gt;<br>        &lt;\/form&gt;<br><br>        &lt;div class=\"overflow-hidden rounded bg-white shadow\"&gt;<br>            &lt;table class=\"w-full text-sm\"&gt;<br>                &lt;thead class=\"bg-gray-50\"&gt;<br>                    &lt;tr&gt;<br>                        &lt;th class=\"p-3 text-left\"&gt;ID&lt;\/th&gt;<br>                        &lt;th class=\"p-3 text-left\"&gt;\u30d5\u30a1\u30a4\u30eb\u540d&lt;\/th&gt;<br>                        &lt;th class=\"p-3 text-left\"&gt;<br>                            \u985e\u4f3c\u5ea6<br>                        &lt;\/th&gt;<br>                        &lt;th class=\"p-3 text-left\"&gt;\u30d5\u30a1\u30a4\u30eb\u306e\u5834\u6240&lt;\/th&gt;<br>                    &lt;\/tr&gt;<br>                &lt;\/thead&gt;<br>                &lt;tbody&gt;<br>                    &lt;tr<br>                        v-for=\"estimateDocument in estimateDocuments\"<br>                        :key=\"estimateDocument.id\"<br>                        class=\"border-t\"<br>                    &gt;<br>                        &lt;td class=\"p-3\" v-text=\"estimateDocument.id\"&gt;&lt;\/td&gt;<br>                        &lt;td<br>                            class=\"p-3\"<br>                            v-text=\"estimateDocument.original_filename\"<br>                        &gt;&lt;\/td&gt;<br>                        &lt;td<br>                            class=\"p-3\"<br>                            v-text=\"estimateDocument.score.toFixed(4)\"<br>                        &gt;&lt;\/td&gt;<br>                        &lt;td class=\"p-3\"&gt;<br>                            &lt;input type=\"text\" class=\"w-full text-xs\" :value=\"estimateDocument.path\" \/&gt;<br>                        &lt;\/td&gt;<br>                    &lt;\/tr&gt;<br>                    &lt;tr v-if=\"estimateDocuments.length === 0\"&gt;<br>                        &lt;td class=\"p-3\" colspan=\"4\"&gt;<br>                            \u898b\u7a4d\u66f8\u306f\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002<br>                        &lt;\/td&gt;<br>                    &lt;\/tr&gt;<br>                &lt;\/tbody&gt;<br>            &lt;\/table&gt;<br>        &lt;\/div&gt;<br>    &lt;\/div&gt;<br>&lt;\/template&gt;<br><br>&lt;script setup lang=\"ts\"&gt;<br>import { <em>Head<\/em>, useForm } from '@inertiajs\/vue3';<br>import { ref } from 'vue';<br><br>interface EstimateDocument {<br>    id: number;<br>    filename: string;<br>    original_filename: string;<br>    path: string;<br>    score: number;<br>}<br><br>const props = <em>withDefaults<\/em>(<br>    <em>defineProps<\/em>&lt;{<br>        q?: string;<br>        estimateDocuments?: EstimateDocument[];<br>    }&gt;(),<br>    {<br>        estimateDocuments: () =&gt; [],<br>    },<br>);<br><br>const form = useForm&lt;{<br>    q: string | undefined;<br>}&gt;({<br>    q: props.q,<br>});<br><br>const loading = ref(false);<br><br>const onSubmit = () =&gt; {<br>    loading.value = true;<br>    form.get(<em>route<\/em>('fuzzy-search.index'), {<br>        preserveState: true,<br>        onFinish: () =&gt; {<br>            loading.value = false;<br>        },<br>    });<br>};<br>&lt;\/script&gt;<\/strong><\/pre>\n\n\n\n<p><strong>app\/Models\/EstimateDocument.php<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>&lt;?php<br><br>namespace App\\Models;<br><br>use Illuminate\\Database\\Eloquent\\Model;<br>use Illuminate\\Support\\Facades\\Storage;<br><br>class EstimateDocument extends Model<br>{<br>    protected $fillable = [<br>        'filename',<br>        'original_filename',<br>    ];<br><br>    public function getPathAttribute(): string<br>    {<br>        return Storage::<em>path<\/em>('public\/estimates\/' . $this-&gt;filename);<br>    }<br>}<\/strong><\/pre>\n\n\n\n<p><strong>database\/migrations\/****_**_**_******_create_estimate_documents_table.php<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>&lt;?php<br><br>use Illuminate\\Database\\Migrations\\Migration;<br>use Illuminate\\Database\\Schema\\Blueprint;<br>use Illuminate\\Support\\Facades\\Schema;<br><br>return new class extends Migration<br>{<br>    public function up()<br>    {<br>        Schema::<em>create<\/em>('estimate_documents', function (Blueprint $table) {<br>            $table-&gt;id();<br>            $table-&gt;string('filename');<br>            $table-&gt;string('original_filename');<br>            $table-&gt;timestamps();<br>        });<br>    }<br><br>    public function down()<br>    {<br>        Schema::<em>dropIfExists<\/em>('estimate_documents');<br>    }<br>};<\/strong><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u30c6\u30b9\u30c8\u3057\u3066\u307f\u308b<\/h2>\n\n\n\n<p>\u3067\u306f\u3001Ollama\u3068Qdrant\u3092\u8d77\u52d5\u3057\u3066\u3001\u307e\u305a\u306f\u4ee5\u4e0b\u306e\u30c7\u30fc\u30bf\u3092\u542b\u3080\u898b\u7a4d\u66f8\u3092<code>PDF<\/code>\u3067\u3064\u304f\u3063\u3066\u691c\u8a3c\u3057\u3066\u307f\u307e\u3059\uff01<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">IT\u958b\u767a\u4f5c\u696d\uff1atest-1.pdf<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u4f5c\u696d\u5185\u5bb9<\/th><th>\u6570\u91cf<\/th><th>\u5358\u4fa1<\/th><th>\u91d1\u984d<\/th><\/tr><\/thead><tbody><tr><td>\u30b7\u30b9\u30c6\u30e0\u8a2d\u8a08\u4f5c\u6210<\/td><td>1<\/td><td>12,345<\/td><td>12,345<\/td><\/tr><tr><td>\u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\u5b9f\u88c5<\/td><td>1<\/td><td>12,345<\/td><td>12,345<\/td><\/tr><tr><td>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u69cb\u7bc9\u4f5c\u696d<\/td><td>1<\/td><td>12,345<\/td><td>12,345<\/td><\/tr><tr><td>API\u958b\u767a\u30fb\u9023\u643a<\/td><td>1<\/td><td>12,345<\/td><td>12,345<\/td><\/tr><tr><td>UI\u30c7\u30b6\u30a4\u30f3\u8abf\u6574<\/td><td>1<\/td><td>12,345<\/td><td>12,345<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">\u4fdd\u5b88\u30fb\u904b\u7528\u4f5c\u696d\uff1atest-2.pdf<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u4f5c\u696d\u5185\u5bb9<\/th><th>\u6570\u91cf<\/th><th>\u5358\u4fa1<\/th><th>\u91d1\u984d<\/th><\/tr><\/thead><tbody><tr><td>\u30b5\u30fc\u30d0\u30fc\u4fdd\u5b88\u70b9\u691c<\/td><td>1<\/td><td>12,345<\/td><td>12,345<\/td><\/tr><tr><td>\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u904b\u7528<\/td><td>1<\/td><td>12,345<\/td><td>12,345<\/td><\/tr><tr><td>\u969c\u5bb3\u5bfe\u5fdc\u30fb\u5fa9\u65e7\u4f5c\u696d<\/td><td>1<\/td><td>12,345<\/td><td>12,345<\/td><\/tr><tr><td>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u76e3\u8996<\/td><td>1<\/td><td>12,345<\/td><td>12,345<\/td><\/tr><tr><td>\u30b7\u30b9\u30c6\u30e0\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8<\/td><td>1<\/td><td>12,345<\/td><td>12,345<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">\u30b3\u30f3\u30b5\u30eb\u30c6\u30a3\u30f3\u30b0\u4f5c\u696d\uff1atest-3.pdf<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u4f5c\u696d\u5185\u5bb9<\/th><th>\u6570\u91cf<\/th><th>\u5358\u4fa1<\/th><th>\u91d1\u984d<\/th><\/tr><\/thead><tbody><tr><td>\u5c0e\u5165\u30b3\u30f3\u30b5\u30eb\u30c6\u30a3\u30f3\u30b0\u3000\u3000 <\/td><td>1<\/td><td>12,345<\/td><td>12,345<\/td><\/tr><tr><td>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u8a3a\u65ad<\/td><td>1<\/td><td>12,345<\/td><td>12,345<\/td><\/tr><tr><td>\u696d\u52d9\u6539\u5584\u63d0\u6848\u66f8\u4f5c\u6210<\/td><td>1<\/td><td>12,345<\/td><td>12,345<\/td><\/tr><tr><td>\u30af\u30e9\u30a6\u30c9\u79fb\u884c\u652f\u63f4<\/td><td>1<\/td><td>12,345<\/td><td>12,345<\/td><\/tr><tr><td>\u7814\u4fee\u30fb\u6559\u80b2\u5b9f\u65bd<\/td><td>1<\/td><td>12,345<\/td><td>12,345<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>\u3067\u306f\u3001\u30d6\u30e9\u30a6\u30b6\u3067\u300chttps:\/\/l12x-vue.test\/fuzzy-search\/create\u300d\u306b\u30a2\u30af\u30bb\u30b9\u3057\u3066\u30013\u3064\u306ePDF\u3092\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-full image-border-3\"><img loading=\"lazy\" decoding=\"async\" width=\"446\" height=\"203\" src=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2025\/12\/ollama-qdrant-fuzzy-search-5.png\" alt=\"\" class=\"wp-image-20052\" srcset=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2025\/12\/ollama-qdrant-fuzzy-search-5.png 446w, https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2025\/12\/ollama-qdrant-fuzzy-search-5-300x137.png 300w\" sizes=\"auto, (max-width: 446px) 100vw, 446px\" \/><\/figure>\n\n\n\n<p>\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u304c\u5b8c\u4e86\u3057\u305f\u3089\u3001<code>Qdrant<\/code>\u3067\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-full image-border-3\"><img loading=\"lazy\" decoding=\"async\" width=\"636\" height=\"291\" src=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2025\/12\/ollama-qdrant-fuzzy-search-6.png\" alt=\"\" class=\"wp-image-20054\" srcset=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2025\/12\/ollama-qdrant-fuzzy-search-6.png 636w, https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2025\/12\/ollama-qdrant-fuzzy-search-6-300x137.png 300w\" sizes=\"auto, (max-width: 636px) 100vw, 636px\" \/><\/figure>\n\n\n\n<p>\u306f\u3044\uff01<br>\u901a\u5e38DB\u306e\u30ec\u30b3\u30fc\u30c9\u306b\u3042\u305f\u308b\u300c\u30dd\u30a4\u30f3\u30c8\u300d\u304c3\u3064\u306b\u306a\u3063\u3066\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3072\u3068\u307e\u305a\u306f\u6210\u529f\u3067\u3059\ud83d\udc4d<\/p>\n\n\n\n<p>\u3067\u306f\u6b21\u306b\u3001\u30e1\u30a4\u30f3\u306e\u3042\u3044\u307e\u3044\u691c\u7d22\u3067\u3059\u306d\u3002<br>\u300chttps:\/\/l12x-vue.test\/fuzzy-search\u300d\u306b\u30a2\u30af\u30bb\u30b9\u3057\u3066\u3001\u307e\u305a\u306f\u300c<strong>\u30b3\u30f3\u30b5\u30eb\u306b\u95a2\u4fc2\u3059\u308b\u898b\u7a4d\u66f8\u3092\u898b\u3064\u3051\u3066<\/strong>\u300d\u3067\u691c\u7d22\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<p>\u3069\u3046\u306a\u308b\u3067\u3057\u3087\u3046\u304b\u30fb\u30fb\u30fb\u30fb\u30fb\u30fb<\/p>\n\n\n\n<figure class=\"wp-block-image size-full image-border-3\"><img loading=\"lazy\" decoding=\"async\" width=\"554\" height=\"371\" src=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2025\/12\/ollama-qdrant-fuzzy-search-7.png\" alt=\"\" class=\"wp-image-20066\" srcset=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2025\/12\/ollama-qdrant-fuzzy-search-7.png 554w, https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2025\/12\/ollama-qdrant-fuzzy-search-7-300x201.png 300w\" sizes=\"auto, (max-width: 554px) 100vw, 554px\" \/><\/figure>\n\n\n\n<p>\u306f\u3044\uff01\u300c\u5c0e\u5165\u30b3\u30f3\u30b5\u30eb\u30c6\u30a3\u30f3\u30b0\u300d\u304c\u542b\u307e\u308c\u3066\u3044\u308b<code>test-3.pdf<\/code>\u304c\u30cf\u30a4\u30b9\u30b3\u30a2\u306b\u306a\u308a\u307e\u3057\u305f\u306d\u3002<\/p>\n\n\n\n<p>\u3067\u306f\u3001\u6b21\u306f\u9006\u306b\u5168\u304f\u95a2\u9023\u304c\u306a\u3044\u300c<strong>\u91ce\u83dc\u306b\u95a2\u4fc2\u3059\u308b\u898b\u7a4d\u66f8\u3092\u898b\u3064\u3051\u3066<\/strong>\u300d\u3067\u691c\u7d22\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3046\u307e\u304f\u3044\u304f\u3067\u3057\u3087\u3046\u304b\u30fb\u30fb\u30fb\u30fb\u30fb\u30fb<\/p>\n\n\n\n<figure class=\"wp-block-image size-full image-border-3\"><img loading=\"lazy\" decoding=\"async\" width=\"556\" height=\"364\" src=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2025\/12\/ollama-qdrant-fuzzy-search-8.png\" alt=\"\" class=\"wp-image-20072\" srcset=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2025\/12\/ollama-qdrant-fuzzy-search-8.png 556w, https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2025\/12\/ollama-qdrant-fuzzy-search-8-300x196.png 300w\" sizes=\"auto, (max-width: 556px) 100vw, 556px\" \/><\/figure>\n\n\n\n<p>\u306f\u3044\uff01\u3059\u3079\u3066\u306e\u30b9\u30b3\u30a2\u304c\u4f4e\u304f\u306a\u308a\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u3053\u3063\u3061\u3082\u6210\u529f\u3067\u3059\u306d\ud83d\ude0a\u2728<\/p>\n\n\n\n<p>\u203b\u3061\u306a\u307f\u306b<\/p>\n\n\n\n<p>\u4eca\u56de\u306f\u691c\u8a3c\u3057\u305f\u30c7\u30fc\u30bf\u6570\u304c\u5c11\u306a\u304b\u3063\u305f\u308a\u3001\u8efd\u91cf\u306eAI\u30e2\u30c7\u30eb\u3092\u3064\u304b\u3063\u3066\u3044\u308b\u305f\u3081\u3001\u5168\u30d1\u30bf\u30fc\u30f3\u306b\u5bfe\u5fdc\u3067\u304d\u308b\u308f\u3051\u3067\u306f\u306a\u3044\u3068\u8003\u3048\u3066\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u306f\u3084\u308a\u3001\u3053\u306e\u8fba\u306f\u30c8\u30e9\u30a4&amp;\u30a8\u30e9\u30fc\u3067\u6539\u5584\u3057\u3066\u3044\u304f\u3057\u304b\u306a\u3055\u305d\u3046\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u3082\u3057<code>ChatGPT<\/code>\u3068\u304b\u3092\u30aa\u30f3\u30d7\u30ec\u30df\u30b9\u3067\u4f7f\u3048\u308c\u3070\u3001\u30b0\u30f3\u30c3\u3068\u7cbe\u5ea6\u306f\u5411\u4e0a\u3059\u308b\u3068\u304a\u3082\u3046\u3093\u3067\u3059\u3051\u3069\u306d\ud83e\udd14<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u4f01\u696d\u69d8\u3078\u306e\u3054\u63d0\u6848<\/h2>\n\n\n\n<p>\u4eca\u56de\u306e\u3088\u3046\u306b\u3001\u30d9\u30af\u30c8\u30ebDB + \u30ed\u30fc\u30ab\u30ebLLM\u3092\u3064\u304b\u3046\u3068\u300c<strong>\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u306b\u91cd\u8981\u306a\u30c7\u30fc\u30bf\u3092\u51fa\u3055\u305a\u306b<\/strong>\u300d<code>ChatGPT<\/code>\u306e\u3088\u3046\u306a\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3082\u3061\u308d\u3093\u7cbe\u5ea6\u306f\u53f6\u308f\u306a\u3044\u3068\u306f\u601d\u3044\u307e\u3059\u304c\u3001<code>Ollama<\/code>\u306a\u3069\u306e\u30e2\u30c7\u30eb\u3067\u3082\u3042\u308b\u7a0b\u5ea6\u306e\u5bfe\u5fdc\u306f\u3067\u304d\u307e\u3059\u3057\u3001\u3082\u3057\u30d1\u30bd\u30b3\u30f3\u306e\u30b9\u30da\u30c3\u30af\u304c\u8a31\u3059\u306a\u3089\u3001\u7cbe\u5ea6\u3082\u9ad8\u3081\u308b\u3053\u3068\u304c\u3067\u304d\u308b\u3067\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<p>\u3082\u3057\u300c<strong>ChatGPT\u3067\u696d\u52d9\u52b9\u7387\u5316\u3057\u305f\u3044\u3051\u3069\u3001\u793e\u5916\u79d8\u30c7\u30fc\u30bf\u3060\u304b\u3089\u2026<\/strong>\u300d\u3068\u3044\u3046\u72b6\u6cc1\u306b\u3042\u308b\u3088\u3046\u3067\u3057\u305f\u3089\u3001\u4f55\u304b\u304a\u529b\u306b\u306a\u308c\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002<\/p>\n\n\n\n<p>\u305c\u3072\u304a\u554f\u3044\u5408\u308f\u305b\u304b\u3089\u3054\u76f8\u8ac7\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<p>\u304a\u5f85\u3061\u3057\u3066\u304a\u308a\u307e\u3059\ud83d\ude0a\u2728<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u304a\u308f\u308a\u306b<\/h2>\n\n\n\n<p>\u3068\u3044\u3046\u3053\u3068\u3067\u3001\u4eca\u56de\u306f\u300c<strong>\u30d9\u30af\u30c8\u30ebDB + \u30ed\u30fc\u30ab\u30ebLLM<\/strong>\u300d\u3067\u898b\u7a4d\u66f8\u306e\u3042\u3044\u307e\u3044\u691c\u7d22\u3092\u3057\u3066\u307f\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u6b63\u76f4\u306a\u3068\u3053\u308d\u3001\u521d\u3081\u306fPDF\u3092\u753b\u50cf\u5316\u3057\u3001\u305d\u308c\u3092<code>Tesseract<\/code>\uff08<code>OCR<\/code>\uff09\u3067\u30c6\u30ad\u30b9\u30c8\u62bd\u51fa\u3059\u308b\u3088\u3046\u306b\u3057\u3066\u305f\u306e\u3067\u3059\u304c\u3001\u7cbe\u5ea6\u304c\u60aa\u304f\u3046\u307e\u304f\u3044\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002<\/p>\n\n\n\n<p class=\"has-small-font-size\">\u203b\u7279\u306b\u3001\u67a0\u7dda\u304c\u5165\u3063\u3066\u3044\u308b\u3068\u9055\u3046\u6587\u5b57\u3068\u8a8d\u8b58\u3057\u3066\u3057\u307e\u3046\u3088\u3046\u3067\u3059\u306d\ud83d\ude05<\/p>\n\n\n\n<p>\u6b21\u306b\u3001<code>pdftotext<\/code>\u3067\u30c6\u30ad\u30b9\u30c8\u3092\u629c\u304d\u51fa\u3059\u3088\u3046\u306b\u3057\u307e\u3057\u305f\u304c\u3001\u3053\u308c\u3082\u898b\u7a4d\u66f8PDF\u5168\u4f53\u3092\u30d9\u30af\u30c8\u30eb\u5316\u3057\u3066\u3044\u305f\u306e\u3067\u3001\u7cbe\u5ea6\u304c\u307e\u3063\u305f\u304f\u51fa\u305a\u3001\u898b\u7a4d\u66f8\u306e\u660e\u7d30\u3060\u3051\u3092\u629c\u304d\u51fa\u3059\u3088\u3046\u306b\u3057\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u3084\u306f\u308a\u3001\u3053\u3046\u3044\u3046\u30b7\u30b9\u30c6\u30e0\u3063\u3066\u5c11\u3057\u305a\u3064\u5de5\u592b\u3092\u3057\u3066\u30d6\u30e9\u30c3\u30b7\u30e5\u30a2\u30c3\u30d7\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u3001\u307e\u305f\u3001\u305d\u3053\u304c\u9762\u767d\u304b\u3063\u305f\u308a\u3059\u308b\u3068\u3053\u308d\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u6700\u5f8c\u306b\u3001\u4eca\u56de\u306f\u3044\u308f\u3086\u308b\u30d0\u30a4\u30d6\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\uff08<code>GitHub Copilot<\/code>\u306e\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u30e2\u30fc\u30c9\uff09\u3067\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u3064\u304f\u3063\u3066\u307f\u307e\u3057\u305f\u304c\u3001\u6b63\u76f4\u307e\u3060\u6e80\u8db3\u3067\u304d\u308b\u3082\u306e\u3067\u306f\u306a\u304b\u3063\u305f\u3067\u3059\u306d\u2026\u3002<\/p>\n\n\n\n<p class=\"has-small-font-size\">\u203b\u30b5\u30b8\u30a7\u30b9\u30c8\u30e2\u30fc\u30c9\u306f\u30d0\u30ea\u30d0\u30ea\u4f7f\u3063\u3066\u307e\u3059\u3088\uff01<\/p>\n\n\n\n<p>\u307e\u305aAI\u304c\u3064\u304f\u3063\u305f\u30b3\u30fc\u30c9\u3092\u8aad\u3093\u3067\u3044\u308b\u3068\u300c\u3044\u3084\u3001\u3053\u3053\u306f\u3053\u3046\u3067\u3057\u3087\uff01\u300d\u3068\u8ffd\u52a0\u3067\u547d\u4ee4\u3057\u307e\u3059\u304c\u3001\u52dd\u624b\u306b\u65b0\u3057\u3044\u30d5\u30a9\u30eb\u30c0\u3084\u30d5\u30a1\u30a4\u30eb\u3064\u304f\u3063\u305f\u308a\u30011\u884c\u3067\u6e08\u3080\u3068\u3053\u308d\u309210\u884c\u4ee5\u4e0a\u3067\u5b9f\u88c5\u3057\u305f\u308a\u3068\u53ef\u8aad\u6027\u3092\u7121\u8996\u3057\u305f\u30b3\u30fc\u30c9\u3070\u304b\u308a\u3067\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u3067\u3082\u3001\u8868\u9762\u4e0a\uff08\u30d6\u30e9\u30a6\u30b6\u4e0a\uff09\u306f\u3046\u307e\u304f\u3044\u3063\u3066\u3044\u308b\u3088\u3046\u306b\u898b\u3048\u308b\u305f\u3081\u3001\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3055\u3093\u306b\u3061\u3083\u3093\u3068\u6211\u3005\u306e\u4fa1\u5024\u3092\u7406\u89e3\u3057\u3066\u3082\u3089\u3046\u52aa\u529b\u3082\u5fc5\u8981\u306b\u306a\u3063\u3066\u304f\u308b\u3068\u601d\u3063\u3066\u307e\u3059\uff08\u7279\u306b\u4fdd\u5b88\u6027\u3084\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u304c\u5fc5\u8981\u6027\u3092\u7406\u89e3\u3057\u3066\u3082\u3089\u3044\u3084\u3059\u3044\u304b\u3082\u3067\u3059\u306d\uff09<\/p>\n\n\n\n<p>\u2026\u3068\u306a\u308b\u3068\u3001\u3080\u3057\u308d\u4eca\u5f8c\u306f\u300c\u79c1\u306f\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u30e2\u30fc\u30c9\u3067\u306f\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u66f8\u304d\u307e\u305b\u3093\uff01\u300d\u3063\u3066\u3086\u3063\u3066\u308b\u4eba\u306e\u65b9\u304c\u4fa1\u5024\u304c\u9ad8\u304f\u306a\u308b\u3053\u3068\u3082\u3042\u308b\u3093\u3067\u3057\u3087\u3046\u304b\ud83e\udd14\u4f9d\u983c\u4e3b\u304b\u3089\u3059\u308b\u3068\u300c\u3060\u3063\u305f\u3089\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3082\u3001\u4fdd\u5b88\u6027\u3082\u3061\u3083\u3093\u3068\u3057\u3066\u308b\u3088\u306d\u300d\u3068\u304b\u3002<\/p>\n\n\n\n<p>AI\u304c\u3082\u3063\u3068\u9032\u6b69\u3059\u308c\u3070\u8a71\u306f\u5225\u3067\u3059\u304c\u30fb\u30fb\u30fb<\/p>\n\n\n\n<p>\u30b7\u30f3\u30ae\u30e5\u30e9\u30ea\u30c6\u30a3\u3001\u6765\u308b\u306a\u3089\u65e9\u304f\u3057\u3066\u3063\u3066\u6c17\u5206\u3067\u3059\uff08\u7b11\uff09<\/p>\n\n\n\n<p>\u3067\u306f\u3067\u306f\u301c\uff01<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"370\" height=\"310\" src=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2019\/08\/no_2.png\" alt=\"\" class=\"wp-image-4445\" srcset=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2019\/08\/no_2.png 370w, https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2019\/08\/no_2-300x251.png 300w\" sizes=\"auto, (max-width: 370px) 100vw, 370px\" \/><\/figure><\/div>\n\n\n<p class=\"has-text-align-center\">\u300c\u307f\u306a\u3055\u3093\u30012025\u5e74\u3082<br>\u304a\u4e16\u8a71\u306b\u306a\u308a\u307e\u3057\u305f\uff01<br>\u3088\u3044\u304a\u5e74\u3092\ud83d\udc4d\u300d<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u3055\u3066\u3055\u3066\u3001\u5b9f\u306f\u524d\u56de\u8a18\u4e8b\u300c\u793e\u5916\u79d8\u30c7\u30fc\u30bf\u3082\u4f7f\u3048\u308b\u751f\u6210AI\u3002Ollama\u3067Linux\u30b3\u30de\u30f3\u30c9\u63d0\u6848\u30c4\u30fc\u30eb\u3092\u3064\u304f\u3063\u3066\u307f\u305f\uff01\u300d\u3067\u304a\u8a71\u3092\u4f3a\u3063\u305f\u793e\u9577\u3055\u3093\u304b\u3089\u3082\u30461\u3064\u9762\u767d\u305d\u3046\u306a\u30ad &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/blog.capilano-fw.com\/?p=19886\" class=\"more-link\"><span class=\"screen-reader-text\">&#8220;\u30d9\u30af\u30c8\u30ebDB + \u30ed\u30fc\u30ab\u30ebLLM\u3067\u898b\u7a4d\u66f8\u306e\u3042\u3044\u307e\u3044\u691c\u7d22\u3092\u3064\u304f\u3063\u3066\u307f\u305f\uff01&#8221; \u306e<\/span>\u7d9a\u304d\u3092\u8aad\u3080<\/a><\/p>\n","protected":false},"author":1,"featured_media":20021,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,265],"tags":[266,267],"class_list":["post-19886","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-laravel","category-ai","tag-ollama","tag-qdrant"],"_links":{"self":[{"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=\/wp\/v2\/posts\/19886","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=19886"}],"version-history":[{"count":281,"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=\/wp\/v2\/posts\/19886\/revisions"}],"predecessor-version":[{"id":20615,"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=\/wp\/v2\/posts\/19886\/revisions\/20615"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=\/wp\/v2\/media\/20021"}],"wp:attachment":[{"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=19886"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=19886"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=19886"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}