{"id":679,"date":"2025-03-24T08:53:10","date_gmt":"2025-03-23T23:53:10","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=679"},"modified":"2025-03-24T08:53:10","modified_gmt":"2025-03-23T23:53:10","slug":"%e3%80%90%e5%ae%8c%e5%85%a8%e3%82%ac%e3%82%a4%e3%83%89%e3%80%91apache-lucene%e3%81%a7%e4%bd%9c%e3%82%8b%e9%ab%98%e6%80%a7%e8%83%bd%e3%81%aa%e5%85%a8%e6%96%87%e6%a4%9c%e7%b4%a2%e3%82%b7%e3%82%b9","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=679","title":{"rendered":"\u3010\u5b8c\u5168\u30ac\u30a4\u30c9\u3011Apache Lucene\u3067\u4f5c\u308b\u9ad8\u6027\u80fd\u306a\u5168\u6587\u691c\u7d22\u30b7\u30b9\u30c6\u30e0\uff1a\u5b9f\u88c5\u624b\u9806\u30687\u3064\u306e\u6700\u9069\u5316\u30c6\u30af\u30cb\u30c3\u30af"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\" id=\"i-0\">Apache Lucene\u3068\u306f\uff1a\u6a5f\u80fd\u3068\u7279\u5fb4\u3092\u5fb9\u5e95\u89e3\u8aac<\/h1>\n\n\n\n<div class=\"toc\"><br \/>\n<b>Warning<\/b>:  Undefined array key \"is_admin\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>116<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_category_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>121<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>128<\/b><br \/>\n    <div id=\"toc_container\" class=\"sgb-toc--bullets js-smooth-scroll\" data-dialog-title=\"\u76ee\u6b21\">\n      <p class=\"toc_title\">\u76ee\u6b21 <\/p>\n      <ul class=\"toc_list\">  <li class=\"first\">    <a href=\"#i-0\">Apache Lucene\u3068\u306f\uff1a\u6a5f\u80fd\u3068\u7279\u5fb4\u3092\u5fb9\u5e95\u89e3\u8aac<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">\u9ad8\u901f\u306a\u5168\u6587\u691c\u7d22\u3092\u5b9f\u73fe\u3059\u308b\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-4\">Elasticsearch\u3068\u306e\u95a2\u4fc2\u6027\u3068\u4f7f\u3044\u5206\u3051<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-8\">Apache Lucene\u3092\u9078\u3076\u3079\u304d7\u3064\u306e\u7406\u7531<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-9\">\u8c4a\u5bcc\u306a\u691c\u7d22\u6a5f\u80fd\u3068\u67d4\u8edf\u306a\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u6027<\/a>      <\/li>      <li>        <a href=\"#i-12\">\u9ad8\u3044\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u7701\u30e1\u30e2\u30ea\u8a2d\u8a08<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-15\">\u5145\u5b9f\u3057\u305fJava\u30e9\u30a4\u30d6\u30e9\u30ea\u3068\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-19\">Apache Lucene\u306e\u57fa\u672c\u5b9f\u88c5\u624b\u9806<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-20\">Maven\/Gradle\u3067\u306e\u4f9d\u5b58\u95a2\u4fc2\u306e\u8a2d\u5b9a<\/a>      <\/li>      <li>        <a href=\"#i-23\">\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u4f5c\u6210\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-26\">\u691c\u7d22\u30af\u30a8\u30ea\u306e\u69cb\u7bc9\u3068\u5b9f\u884c\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-29\">\u5b9f\u8df5\u7684\u306a\u691c\u7d22\u6a5f\u80fd\u306e\u5b9f\u88c5\u30c6\u30af\u30cb\u30c3\u30af<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-30\">\u65e5\u672c\u8a9e\u5f62\u614b\u7d20\u89e3\u6790\u306e\u5c0e\u5165\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-32\">\u30d5\u30a1\u30bb\u30c3\u30c8\u691c\u7d22\u306e\u5b9f\u88c5\u624b\u9806<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-35\">\u30b9\u30b3\u30a2\u30ea\u30f3\u30b0\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-38\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e7\u3064\u306e\u30c6\u30af\u30cb\u30c3\u30af<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-39\">\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u8a2d\u8a08\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>      <\/li>      <li>        <a href=\"#i-42\">\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-45\">\u4e26\u5217\u51e6\u7406\u306b\u3088\u308b\u691c\u7d22\u306e\u9ad8\u901f\u5316<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-49\">\u904b\u7528\u74b0\u5883\u3067\u306e\u6ce8\u610f\u70b9\u3068\u76e3\u8996\u65b9\u6cd5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-50\">\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u6700\u9069\u5316\u3068\u76e3\u8996<\/a>      <\/li>      <li>        <a href=\"#i-53\">\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u3068\u5fa9\u65e7\u624b\u9806<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-55\">\u6027\u80fd\u52a3\u5316\u306e\u4e88\u9632\u3068\u5bfe\u7b56\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-58\">\u767a\u5c55\u7684\u306a\u4f7f\u3044\u65b9\u3068\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-59\">\u985e\u4f3c\u6587\u66f8\u691c\u7d22\u306e\u5b9f\u88c5\u4f8b<\/a>      <\/li>      <li>        <a href=\"#i-62\">\u5730\u7406\u7a7a\u9593\u691c\u7d22\u306e\u5c0e\u5165\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-64\">\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u691c\u7d22\u306e\u5b9f\u73fe\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-66\">\u307e\u3068\u3081\uff1aApache Lucene\u3067\u5b9f\u73fe\u3059\u308b\u6b21\u4e16\u4ee3\u306e\u691c\u7d22\u30b7\u30b9\u30c6\u30e0<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-67\">\u5b9f\u88c5\u306e\u30ad\u30fc\u30dd\u30a4\u30f3\u30c8<\/a>      <\/li>      <li>        <a href=\"#i-68\">\u958b\u767a\u30ed\u30fc\u30c9\u30de\u30c3\u30d7\u306e\u63d0\u6848<\/a>      <\/li>      <li>        <a href=\"#i-69\">\u4eca\u5f8c\u306e\u767a\u5c55\u65b9\u5411\u6027<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-70\">\u6700\u7d42\u30a2\u30c9\u30d0\u30a4\u30b9<\/a>      <\/li>    <\/ul>  <\/li><\/ul>\n      <a href=\"#\" class=\"sgb-toc-button js-toc-button\" rel=\"nofollow\" data-open-dialog=\"true\"><i class=\"fa fa-list\"><\/i><span class=\"sgb-toc-button__text\">\u76ee\u6b21\u3078<\/span><\/a>\n    <\/div><\/div><h2 class=\"wp-block-heading\" id=\"i-1\">\u9ad8\u901f\u306a\u5168\u6587\u691c\u7d22\u3092\u5b9f\u73fe\u3059\u308b\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3<\/h2>\n\n\n\n<p>Apache Lucene\u306f\u3001\u9ad8\u6027\u80fd\u306a\u5168\u6587\u691c\u7d22\u30a8\u30f3\u30b8\u30f3\u30e9\u30a4\u30d6\u30e9\u30ea\u3067\u3059\u3002Java \u3067\u5b9f\u88c5\u3055\u308c\u305f\u5f37\u529b\u306a\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u306e\u691c\u7d22\u30a8\u30f3\u30b8\u30f3\u3067\u3001\u591a\u304f\u306e\u691c\u7d22\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u57fa\u76e4\u3068\u3057\u3066\u4f7f\u7528\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3\u306e\u7279\u5fb4<\/h3>\n\n\n\n<p>Lucene\u306e\u9ad8\u901f\u306a\u691c\u7d22\u3092\u652f\u3048\u308b\u4e3b\u8981\u306a\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3\u8981\u7d20\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u8ee2\u7f6e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\uff08Inverted Index\uff09\u69cb\u9020<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u5358\u8a9e\u3092\u30ad\u30fc\u3068\u3057\u3066\u6587\u66f8ID\u3092\u30ea\u30b9\u30c8\u5316<\/li>\n\n\n\n<li>\u9ad8\u901f\u306a\u5168\u6587\u691c\u7d22\u3092\u5b9f\u73fe\u3059\u308b\u6838\u3068\u306a\u308b\u6280\u8853<\/li>\n\n\n\n<li>\u52b9\u7387\u7684\u306a\u30e1\u30e2\u30ea\u4f7f\u7528\u3068\u691c\u7d22\u6027\u80fd\u306e\u4e21\u7acb<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u30bb\u30b0\u30e1\u30f3\u30c8\u7ba1\u7406<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u8907\u6570\u306e\u30bb\u30b0\u30e1\u30f3\u30c8\u306b\u5206\u5272<\/li>\n\n\n\n<li>\u66f4\u65b0\u6642\u306e\u90e8\u5206\u7684\u306a\u518d\u69cb\u7bc9\u3067\u52b9\u7387\u5316<\/li>\n\n\n\n<li>\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u3067\u306e\u30de\u30fc\u30b8\u51e6\u7406<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u30d5\u30a3\u30fc\u30eb\u30c9\u5358\u4f4d\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u8a2d\u8a08<\/strong><\/li>\n<\/ol>\n\n\n<div id=\"id-16f93ad1-3c6a-4a7d-b0fb-8f3a453f14a3\">\n<figure class=\"wp-block-table is-style-stripes\"><table class=\"has-fixed-layout\"><thead><tr><th>\u30d5\u30a3\u30fc\u30eb\u30c9\u30bf\u30a4\u30d7<\/th><th>\u7528\u9014<\/th><th>\u7279\u5fb4<\/th><\/tr><\/thead><tbody><tr><td>TextField<\/td><td>\u5168\u6587\u691c\u7d22\u7528<\/td><td>\u5f62\u614b\u7d20\u89e3\u6790\u3001\u5358\u8a9e\u5206\u5272\u3092\u5b9f\u65bd<\/td><\/tr><tr><td>StringField<\/td><td>\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u7528<\/td><td>\u5b8c\u5168\u4e00\u81f4\u691c\u7d22\u306b\u6700\u9069\u5316<\/td><\/tr><tr><td>NumericField<\/td><td>\u6570\u5024\u30c7\u30fc\u30bf\u7528<\/td><td>\u7bc4\u56f2\u691c\u7d22\u304c\u9ad8\u901f<\/td><\/tr><tr><td>StoredField<\/td><td>\u5143\u30c7\u30fc\u30bf\u4fdd\u5b58\u7528<\/td><td>\u691c\u7d22\u7d50\u679c\u8868\u793a\u306b\u4f7f\u7528<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"i-3\">\u691c\u7d22\u51e6\u7406\u306e\u6700\u9069\u5316\u6a5f\u69cb<\/h3>\n\n\n\n<p>Lucene\u306f\u4ee5\u4e0b\u306e\u6a5f\u69cb\u306b\u3088\u308a\u3001\u5927\u898f\u6a21\u30c7\u30fc\u30bf\u3067\u3082\u9ad8\u901f\u306a\u691c\u7d22\u3092\u5b9f\u73fe\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u30b9\u30b3\u30a2\u30ea\u30f3\u30b0\u6700\u9069\u5316<\/strong>\n<ul class=\"wp-block-list\">\n<li>TF-IDF\uff08Term Frequency-Inverse Document Frequency\uff09<\/li>\n\n\n\n<li>BM25\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0\u306b\u3088\u308b\u30e9\u30f3\u30ad\u30f3\u30b0<\/li>\n\n\n\n<li>\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u53ef\u80fd\u306a\u30d6\u30fc\u30b9\u30c8\u6a5f\u80fd<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u30ad\u30e3\u30c3\u30b7\u30e5\u6a5f\u69cb<\/strong> java<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30d5\u30a3\u30fc\u30eb\u30c9\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u4f8b\nSort sort = new Sort(new SortField(\"price\", SortField.Type.INT));\n\/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u3092\u4f7f\u7528\u3057\u305f\u9ad8\u901f\u306a\u30bd\u30fc\u30c8\u51e6\u7406\nTopDocs results = searcher.search(query, 10, sort);<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-4\">Elasticsearch\u3068\u306e\u95a2\u4fc2\u6027\u3068\u4f7f\u3044\u5206\u3051<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-5\">\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3\u6bd4\u8f03<\/h3>\n\n\n<div id=\"id-e7c991e7-c367-4d3b-9c54-73ca282c7714\">\n<figure class=\"wp-block-table is-style-stripes\"><table class=\"has-fixed-layout\"><thead><tr><th>\u7279\u5fb4<\/th><th>Apache Lucene<\/th><th>Elasticsearch<\/th><\/tr><\/thead><tbody><tr><td>\u5f62\u614b<\/td><td>\u30e9\u30a4\u30d6\u30e9\u30ea<\/td><td>\u5206\u6563\u691c\u7d22\u30a8\u30f3\u30b8\u30f3<\/td><\/tr><tr><td>\u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3<\/td><td>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u4f9d\u5b58<\/td><td>\u6c34\u5e73\u30b9\u30b1\u30fc\u30eb\u53ef\u80fd<\/td><\/tr><tr><td>\u5b66\u7fd2\u30b3\u30b9\u30c8<\/td><td>\u3088\u308a\u8a73\u7d30\u306a\u7406\u89e3\u304c\u5fc5\u8981<\/td><td>\u6bd4\u8f03\u7684\u5c0e\u5165\u304c\u5bb9\u6613<\/td><\/tr><tr><td>\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u6027<\/td><td>\u9ad8\u3044<\/td><td>\u30d7\u30e9\u30b0\u30a4\u30f3\u5f62\u5f0f<\/td><\/tr><tr><td>\u904b\u7528\u7ba1\u7406<\/td><td>\u81ea\u524d\u3067\u306e\u5b9f\u88c5\u304c\u5fc5\u8981<\/td><td>\u7ba1\u7406\u6a5f\u80fd\u304c\u5145\u5b9f<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"i-6\">\u4f7f\u3044\u5206\u3051\u306e\u6307\u91dd<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Lucene\u3092\u9078\u3076\u30b1\u30fc\u30b9<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u6027\u304c\u91cd\u8981\u306a\u5834\u5408<\/li>\n\n\n\n<li>\u65e2\u5b58\u306eJava\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3078\u306e\u7d44\u307f\u8fbc\u307f<\/li>\n\n\n\n<li>\u30ea\u30bd\u30fc\u30b9\u3092\u6700\u5c0f\u9650\u306b\u6291\u3048\u305f\u3044\u5834\u5408<\/li>\n\n\n\n<li>\u691c\u7d22\u30ed\u30b8\u30c3\u30af\u306e\u8a73\u7d30\u306a\u5236\u5fa1\u304c\u5fc5\u8981\u306a\u5834\u5408<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Elasticsearch\u3092\u9078\u3076\u30b1\u30fc\u30b9<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u5206\u6563\u30b7\u30b9\u30c6\u30e0\u304c\u5fc5\u8981\u306a\u5834\u5408<\/li>\n\n\n\n<li>\u904b\u7528\u7ba1\u7406\u306e\u5bb9\u6613\u3055\u3092\u91cd\u8996<\/li>\n\n\n\n<li>RESTful API\u3067\u306e\u5229\u7528<\/li>\n\n\n\n<li>\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u306a\u691c\u7d22\u304c\u5fc5\u8981\u306a\u5834\u5408<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-7\">\u5b9f\u88c5\u4f8b\u306b\u3088\u308b\u6bd4\u8f03<\/h3>\n\n\n\n<p>Lucene\u3067\u306e\u5b9f\u88c5\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u4f5c\u6210\nDirectory directory = FSDirectory.open(Paths.get(\"\/path\/to\/index\"));\nIndexWriter writer = new IndexWriter(directory, new IndexWriterConfig());\n\n\/\/ \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u8ffd\u52a0\nDocument doc = new Document();\ndoc.add(new TextField(\"content\", \"\u691c\u7d22\u5bfe\u8c61\u30c6\u30ad\u30b9\u30c8\", Field.Store.YES));\nwriter.addDocument(doc);\n\n\/\/ \u691c\u7d22\u306e\u5b9f\u884c\nIndexReader reader = DirectoryReader.open(directory);\nIndexSearcher searcher = new IndexSearcher(reader);\nQuery query = new TermQuery(new Term(\"content\", \"\u691c\u7d22\"));\nTopDocs results = searcher.search(query, 10);<\/pre>\n\n\n\n<p>Elasticsearch\u3067\u306e\u5b9f\u88c5\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ RESTful API\u3067\u306e\u64cd\u4f5c\nPUT \/my_index\/_doc\/1\n{\n  \"content\": \"\u691c\u7d22\u5bfe\u8c61\u30c6\u30ad\u30b9\u30c8\"\n}\n\nGET \/my_index\/_search\n{\n  \"query\": {\n    \"term\": {\n      \"content\": \"\u691c\u7d22\"\n    }\n  }\n}<\/pre>\n\n\n\n<p>\u3053\u306e\u3088\u3046\u306b\u3001Lucene\u3068Elasticsearch\u306f\u305d\u308c\u305e\u308c\u306b\u7279\u5fb4\u304c\u3042\u308a\u3001\u8981\u4ef6\u306b\u5fdc\u3058\u3066\u9069\u5207\u306a\u9078\u629e\u304c\u5fc5\u8981\u3067\u3059\u3002Lucene\u306f\u4f4e\u30ec\u30d9\u30eb\u306a\u5236\u5fa1\u304c\u53ef\u80fd\u3067\u3001\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u6027\u306b\u512a\u308c\u3066\u3044\u308b\u4e00\u65b9\u3001Elasticsearch\u306f\u904b\u7528\u7ba1\u7406\u306e\u5bb9\u6613\u3055\u3068\u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3\u306b\u512a\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"i-8\">Apache Lucene\u3092\u9078\u3076\u3079\u304d7\u3064\u306e\u7406\u7531<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-9\">\u8c4a\u5bcc\u306a\u691c\u7d22\u6a5f\u80fd\u3068\u67d4\u8edf\u306a\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u6027<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">1. \u9ad8\u5ea6\u306a\u691c\u7d22\u6a5f\u80fd<\/h3>\n\n\n\n<p>Lucene\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u8c4a\u5bcc\u306a\u691c\u7d22\u6a5f\u80fd\u3092\u6a19\u6e96\u3067\u63d0\u4f9b\u3057\u3066\u3044\u307e\u3059\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u30af\u30a8\u30ea\u306e\u7a2e\u985e<\/strong><\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">  \/\/ \u3042\u3044\u307e\u3044\u691c\u7d22\n  FuzzyQuery fuzzyQuery = new FuzzyQuery(new Term(\"field\", \"\u691c\u7d22\u8a9e\"), 2);\n\n  \/\/ \u30d5\u30ec\u30fc\u30ba\u691c\u7d22\n  PhraseQuery phraseQuery = new PhraseQuery.Builder()\n      .add(new Term(\"field\", \"\u691c\u7d22\"))\n      .add(new Term(\"field\", \"\u30a8\u30f3\u30b8\u30f3\"))\n      .build();\n\n  \/\/ \u524d\u65b9\u4e00\u81f4\u30fb\u5f8c\u65b9\u4e00\u81f4\n  WildcardQuery wildcardQuery = new WildcardQuery(new Term(\"field\", \"\u691c\u7d22*\"));<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u8907\u5408\u691c\u7d22\u6761\u4ef6<\/strong><\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">  BooleanQuery.Builder builder = new BooleanQuery.Builder();\n  builder.add(new TermQuery(new Term(\"title\", \"Java\")), BooleanClause.Occur.MUST);\n  builder.add(new TermQuery(new Term(\"content\", \"\u691c\u7d22\")), BooleanClause.Occur.SHOULD);\n  BooleanQuery query = builder.build();<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-11\">2. \u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u306e\u81ea\u7531\u5ea6<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30a2\u30ca\u30e9\u30a4\u30b6\u30fc\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba<\/li>\n\n\n\n<li>\u30b9\u30b3\u30a2\u30ea\u30f3\u30b0\u30ed\u30b8\u30c3\u30af\u306e\u5909\u66f4<\/li>\n\n\n\n<li>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u69cb\u9020\u306e\u6700\u9069\u5316<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-12\">\u9ad8\u3044\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u7701\u30e1\u30e2\u30ea\u8a2d\u8a08<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-13\">3. \u6700\u9069\u5316\u3055\u308c\u305f\u691c\u7d22\u6027\u80fd<\/h3>\n\n\n<div id=\"id-e5a8c286-319d-48ad-ae89-2d8a42b4bb12\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u6a5f\u80fd<\/th><th>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u7279\u6027<\/th><th>\u5229\u70b9<\/th><\/tr><\/thead><tbody><tr><td>\u8ee2\u7f6e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9<\/td><td>O(1)\u3067\u306e\u691c\u7d22<\/td><td>\u5927\u898f\u6a21\u30c7\u30fc\u30bf\u3067\u3082\u9ad8\u901f<\/td><\/tr><tr><td>\u30bb\u30b0\u30e1\u30f3\u30c8\u7ba1\u7406<\/td><td>\u66f4\u65b0\u30b3\u30b9\u30c8\u306e\u5206\u6563<\/td><td>\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u6027\u306e\u5411\u4e0a<\/td><\/tr><tr><td>\u30d5\u30a3\u30eb\u30bf\u30ad\u30e3\u30c3\u30b7\u30e5<\/td><td>\u30e1\u30e2\u30ea\u52b9\u7387\u306e\u6700\u9069\u5316<\/td><td>\u30ea\u30bd\u30fc\u30b9\u4f7f\u7528\u306e\u7bc0\u7d04<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"i-14\">4. \u7701\u30e1\u30e2\u30ea\u8a2d\u8a08\u306e\u7279\u5fb4<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30e1\u30e2\u30ea\u52b9\u7387\u3092\u8003\u616e\u3057\u305f\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u8a2d\u5b9a\nIndexWriterConfig config = new IndexWriterConfig(analyzer);\nconfig.setRAMBufferSizeMB(256.0); \/\/ RAM\u4f7f\u7528\u91cf\u306e\u5236\u5fa1\nconfig.setMaxBufferedDocs(10000); \/\/ \u30d0\u30c3\u30d5\u30a1\u30b5\u30a4\u30ba\u306e\u6700\u9069\u5316\n\n\/\/ \u30c7\u30a3\u30b9\u30af\u30d9\u30fc\u30b9\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u7ba1\u7406\nDirectory directory = FSDirectory.open(Paths.get(\"\/path\/to\/index\"));<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-15\">\u5145\u5b9f\u3057\u305fJava\u30e9\u30a4\u30d6\u30e9\u30ea\u3068\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-16\">5. \u8c4a\u5bcc\u306aAPI\u3068\u4f7f\u3044\u3084\u3059\u3055<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u6a19\u6e96\u5316\u3055\u308c\u305f\u64cd\u4f5c\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9<\/strong><\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">  \/\/ \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u4f5c\u6210\u304b\u3089\u691c\u7d22\u307e\u3067\u306e\u57fa\u672c\u7684\u306a\u6d41\u308c\n  try (IndexWriter writer = new IndexWriter(directory, config)) {\n      Document doc = new Document();\n      doc.add(new TextField(\"title\", \"\u30bf\u30a4\u30c8\u30eb\", Field.Store.YES));\n      doc.add(new TextField(\"content\", \"\u5185\u5bb9\", Field.Store.YES));\n      writer.addDocument(doc);\n  }\n\n  try (IndexReader reader = DirectoryReader.open(directory)) {\n      IndexSearcher searcher = new IndexSearcher(reader);\n      Query query = new TermQuery(new Term(\"title\", \"\u691c\u7d22\u8a9e\"));\n      TopDocs results = searcher.search(query, 10);\n  }<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-17\">6. \u5145\u5b9f\u3057\u305f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3068\u30b3\u30df\u30e5\u30cb\u30c6\u30a3<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>JavaDoc\u306b\u3088\u308b\u8a73\u7d30\u306aAPI\u8aac\u660e<\/li>\n\n\n\n<li>\u6d3b\u767a\u306a\u30b3\u30df\u30e5\u30cb\u30c6\u30a3\u652f\u63f4<\/li>\n\n\n\n<li>\u8c4a\u5bcc\u306a\u30b5\u30f3\u30d7\u30eb\u30b3\u30fc\u30c9\u3068\u4e8b\u4f8b<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-18\">7. \u30a8\u30f3\u30bf\u30fc\u30d7\u30e9\u30a4\u30ba\u3067\u306e\u5b9f\u7e3e<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u5927\u898f\u6a21\u30b7\u30b9\u30c6\u30e0\u3067\u306e\u63a1\u7528\u5b9f\u7e3e<\/strong>\n<ul class=\"wp-block-list\">\n<li>Amazon<\/li>\n\n\n\n<li>Twitter<\/li>\n\n\n\n<li>LinkedIn<\/li>\n\n\n\n<li>Netflix<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u4fe1\u983c\u6027\u306e\u9ad8\u3055<\/strong>\n<ul class=\"wp-block-list\">\n<li>Apache Software Foundation\u306b\u3088\u308b\u9577\u671f\u30b5\u30dd\u30fc\u30c8<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u306e\u7d99\u7d9a\u7684\u306a\u63d0\u4f9b<\/li>\n\n\n\n<li>\u30d0\u30b0\u4fee\u6b63\u306e\u8fc5\u901f\u306a\u5bfe\u5fdc<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>\u4ee5\u4e0a\u306e7\u3064\u306e\u7406\u7531\u304b\u3089\u3001Apache Lucene\u306f\u7279\u306b\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u5834\u5408\u306b\u6700\u9069\u306a\u9078\u629e\u80a2\u3068\u306a\u308a\u307e\u3059\uff1a<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt\">\u60f3\u5b9a\u3055\u308c\u308b\u6700\u9069\u306a\u5834\u5408<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u6027\u306e\u9ad8\u3044\u691c\u7d22\u30b7\u30b9\u30c6\u30e0\u304c\u5fc5\u8981\u306a\u5834\u5408<\/li>\n\n\n\n<li>\u65e2\u5b58\u306eJava\u30b7\u30b9\u30c6\u30e0\u3078\u306e\u7d71\u5408\u3092\u691c\u8a0e\u3057\u3066\u3044\u308b\u5834\u5408<\/li>\n\n\n\n<li>\u30ea\u30bd\u30fc\u30b9\u52b9\u7387\u3092\u91cd\u8996\u3059\u308b\u5834\u5408<\/li>\n\n\n\n<li>\u30a8\u30f3\u30bf\u30fc\u30d7\u30e9\u30a4\u30ba\u30ec\u30d9\u30eb\u306e\u4fe1\u983c\u6027\u304c\u6c42\u3081\u3089\u308c\u308b\u5834\u5408<\/li>\n<\/ol>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u7279\u5fb4\u306f\u3001\u591a\u304f\u306e\u958b\u767a\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067Lucene\u304c\u9078\u3070\u308c\u3066\u3044\u308b\u4e3b\u306a\u7406\u7531\u3068\u306a\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"i-19\">Apache Lucene\u306e\u57fa\u672c\u5b9f\u88c5\u624b\u9806<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-20\">Maven\/Gradle\u3067\u306e\u4f9d\u5b58\u95a2\u4fc2\u306e\u8a2d\u5b9a<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-21\">Maven\u306e\u5834\u5408<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;dependencies&gt;\n    &lt;!-- Lucene Core --&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;org.apache.lucene&lt;\/groupId&gt;\n        &lt;artifactId&gt;lucene-core&lt;\/artifactId&gt;\n        &lt;version&gt;9.8.0&lt;\/version&gt;\n    &lt;\/dependency&gt;\n\n    &lt;!-- \u65e5\u672c\u8a9e\u89e3\u6790\u7528 --&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;org.apache.lucene&lt;\/groupId&gt;\n        &lt;artifactId&gt;lucene-analyzers-kuromoji&lt;\/artifactId&gt;\n        &lt;version&gt;9.8.0&lt;\/version&gt;\n    &lt;\/dependency&gt;\n\n    &lt;!-- \u30af\u30a8\u30ea\u30d1\u30fc\u30b5\u30fc\u7528 --&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;org.apache.lucene&lt;\/groupId&gt;\n        &lt;artifactId&gt;lucene-queryparser&lt;\/artifactId&gt;\n        &lt;version&gt;9.8.0&lt;\/version&gt;\n    &lt;\/dependency&gt;\n&lt;\/dependencies&gt;<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-22\">Gradle\u306e\u5834\u5408<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">dependencies {\n    implementation 'org.apache.lucene:lucene-core:9.8.0'\n    implementation 'org.apache.lucene:lucene-analyzers-kuromoji:9.8.0'\n    implementation 'org.apache.lucene:lucene-queryparser:9.8.0'\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-23\">\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u4f5c\u6210\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-24\">1. \u57fa\u672c\u7684\u306a\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u4f5c\u6210<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class LuceneIndexer {\n    private final Directory directory;\n    private final IndexWriter writer;\n\n    public LuceneIndexer(String indexPath) throws IOException {\n        \/\/ \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u8a2d\u5b9a\n        this.directory = FSDirectory.open(Paths.get(indexPath));\n\n        \/\/ Analyzer\u306e\u8a2d\u5b9a\uff08\u65e5\u672c\u8a9e\u5bfe\u5fdc\uff09\n        Analyzer analyzer = new JapaneseAnalyzer();\n\n        \/\/ IndexWriterConfig\u306e\u8a2d\u5b9a\n        IndexWriterConfig config = new IndexWriterConfig(analyzer);\n        config.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);\n\n        \/\/ IndexWriter\u306e\u521d\u671f\u5316\n        this.writer = new IndexWriter(directory, config);\n    }\n\n    public void addDocument(String title, String content, LocalDateTime createdAt) throws IOException {\n        \/\/ \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u4f5c\u6210\n        Document doc = new Document();\n\n        \/\/ \u30d5\u30a3\u30fc\u30eb\u30c9\u306e\u8ffd\u52a0\n        doc.add(new TextField(\"title\", title, Field.Store.YES));\n        doc.add(new TextField(\"content\", content, Field.Store.YES));\n        doc.add(new StringField(\"created_at\", createdAt.toString(), Field.Store.YES));\n\n        \/\/ \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306b\u8ffd\u52a0\n        writer.addDocument(doc);\n    }\n\n    public void commit() throws IOException {\n        writer.commit();\n    }\n\n    public void close() throws IOException {\n        writer.close();\n        directory.close();\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-25\">2. \u52b9\u7387\u7684\u306a\u4e00\u62ec\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u4f5c\u6210<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public void bulkIndex(List&lt;Document&gt; documents) throws IOException {\n    \/\/ RAM\u30d0\u30c3\u30d5\u30a1\u30b5\u30a4\u30ba\u306e\u8a2d\u5b9a\n    writer.getConfig().setRAMBufferSizeMB(256.0);\n\n    \/\/ \u30de\u30fc\u30b8\u30dd\u30ea\u30b7\u30fc\u306e\u8a2d\u5b9a\n    LogMergePolicy mergePolicy = new LogMergePolicy();\n    mergePolicy.setMergeFactor(10);\n    writer.getConfig().setMergePolicy(mergePolicy);\n\n    \/\/ \u4e00\u62ec\u8ffd\u52a0\n    for (Document doc : documents) {\n        writer.addDocument(doc);\n    }\n\n    \/\/ \u5f37\u5236\u30de\u30fc\u30b8\uff08\u30aa\u30d7\u30b7\u30e7\u30f3\uff09\n    writer.forceMerge(1);\n    writer.commit();\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-26\">\u691c\u7d22\u30af\u30a8\u30ea\u306e\u69cb\u7bc9\u3068\u5b9f\u884c\u65b9\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-27\">1. \u57fa\u672c\u7684\u306a\u691c\u7d22\u5b9f\u88c5<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class LuceneSearcher {\n    private final IndexSearcher searcher;\n    private final Analyzer analyzer;\n\n    public LuceneSearcher(String indexPath) throws IOException {\n        Directory directory = FSDirectory.open(Paths.get(indexPath));\n        IndexReader reader = DirectoryReader.open(directory);\n        this.searcher = new IndexSearcher(reader);\n        this.analyzer = new JapaneseAnalyzer();\n    }\n\n    public List&lt;SearchResult&gt; search(String queryStr, int maxHits) throws IOException, ParseException {\n        \/\/ \u30af\u30a8\u30ea\u30d1\u30fc\u30b5\u30fc\u306e\u8a2d\u5b9a\n        QueryParser parser = new QueryParser(\"content\", analyzer);\n        Query query = parser.parse(queryStr);\n\n        \/\/ \u691c\u7d22\u306e\u5b9f\u884c\n        TopDocs results = searcher.search(query, maxHits);\n\n        \/\/ \u7d50\u679c\u306e\u53d6\u5f97\n        List&lt;SearchResult&gt; searchResults = new ArrayList&lt;&gt;();\n        for (ScoreDoc scoreDoc : results.scoreDocs) {\n            Document doc = searcher.doc(scoreDoc.doc);\n            searchResults.add(new SearchResult(\n                doc.get(\"title\"),\n                doc.get(\"content\"),\n                doc.get(\"created_at\"),\n                scoreDoc.score\n            ));\n        }\n\n        return searchResults;\n    }\n}\n\n\/\/ \u691c\u7d22\u7d50\u679c\u3092\u683c\u7d0d\u3059\u308b\u30af\u30e9\u30b9\npublic class SearchResult {\n    private final String title;\n    private final String content;\n    private final String createdAt;\n    private final float score;\n\n    \/\/ \u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u3001\u30b2\u30c3\u30bf\u30fc\u306f\u7701\u7565\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-28\">2. \u9ad8\u5ea6\u306a\u691c\u7d22\u30af\u30a8\u30ea\u306e\u4f8b<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public Query buildAdvancedQuery(String keyword, String title, LocalDateTime fromDate) {\n    BooleanQuery.Builder queryBuilder = new BooleanQuery.Builder();\n\n    \/\/ \u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\uff08\u672c\u6587\uff09\n    if (keyword != null &amp;&amp; !keyword.isEmpty()) {\n        queryBuilder.add(new TermQuery(new Term(\"content\", keyword)), BooleanClause.Occur.MUST);\n    }\n\n    \/\/ \u30bf\u30a4\u30c8\u30eb\u691c\u7d22\n    if (title != null &amp;&amp; !title.isEmpty()) {\n        queryBuilder.add(new TermQuery(new Term(\"title\", title)), BooleanClause.Occur.SHOULD);\n    }\n\n    \/\/ \u65e5\u4ed8\u7bc4\u56f2\u691c\u7d22\n    if (fromDate != null) {\n        Query dateQuery = NumericRangeQuery.newLongRange(\n            \"created_at\",\n            fromDate.toEpochSecond(ZoneOffset.UTC),\n            null,\n            true,\n            true\n        );\n        queryBuilder.add(dateQuery, BooleanClause.Occur.MUST);\n    }\n\n    return queryBuilder.build();\n}<\/pre>\n\n\n\n<p>\u3053\u306e\u57fa\u672c\u5b9f\u88c5\u306f\u4ee5\u4e0b\u306e\u7279\u5fb4\u3092\u6301\u3063\u3066\u3044\u307e\u3059\uff1a<\/p>\n\n\n\n<div class=\"wp-block-sgb-block-simple sgb-box-simple sgb-box-simple--title-normal sgb-box-simple--with-border\"><div style=\"background-color:var(--wp--preset--color--sango-main);color:#FFF\" class=\"sgb-box-simple__title\">\u7279\u5fb4<\/div><div class=\"sgb-box-simple__body\" style=\"border-color:var(--wp--preset--color--sango-main);background-color:#FFF\">\n<ol class=\"wp-block-list\">\n<li><strong>\u30e2\u30b8\u30e5\u30fc\u30eb\u5316\u3055\u308c\u305f\u8a2d\u8a08<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u4f5c\u6210\u3068\u691c\u7d22\u3092\u5225\u30af\u30e9\u30b9\u306b\u5206\u96e2<\/li>\n\n\n\n<li>\u8cac\u52d9\u306e\u660e\u78ba\u306a\u5206\u96e2\u306b\u3088\u308a\u4fdd\u5b88\u6027\u304c\u5411\u4e0a<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u30ea\u30bd\u30fc\u30b9\u7ba1\u7406\u306e\u8003\u616e<\/strong>\n<ul class=\"wp-block-list\">\n<li>try-with-resources\u30d1\u30bf\u30fc\u30f3\u306e\u4f7f\u7528\u63a8\u5968<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30af\u30ed\u30fc\u30ba\u51e6\u7406\u306e\u5b9f\u88c5<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u62e1\u5f35\u6027\u306e\u78ba\u4fdd<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u53ef\u80fd\u306a\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u67d4\u8edf\u306a\u30af\u30a8\u30ea\u30d3\u30eb\u30c0\u30fc\u30d1\u30bf\u30fc\u30f3<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u9069\u5207\u306a\u4f8b\u5916\u51e6\u7406\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30ea\u30bd\u30fc\u30b9\u30ea\u30fc\u30af\u306e\u9632\u6b62<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<\/div><\/div>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u57fa\u672c\u5b9f\u88c5\u3092\u30d9\u30fc\u30b9\u306b\u3001\u5177\u4f53\u7684\u306a\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\u306b\u5fdc\u3058\u3066\u6a5f\u80fd\u3092\u8ffd\u52a0\u3057\u3066\u3044\u304f\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"i-29\">\u5b9f\u8df5\u7684\u306a\u691c\u7d22\u6a5f\u80fd\u306e\u5b9f\u88c5\u30c6\u30af\u30cb\u30c3\u30af<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-30\">\u65e5\u672c\u8a9e\u5f62\u614b\u7d20\u89e3\u6790\u306e\u5c0e\u5165\u65b9\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-31\">Kuromoji Analyzer\u306e\u8a2d\u5b9a<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class JapaneseSearchConfig {\n    public static Analyzer createOptimizedAnalyzer() {\n        \/\/ \u30ab\u30b9\u30bf\u30e0\u8a2d\u5b9a\u3067KuromojiAnalyzer\u3092\u4f5c\u6210\n        return new JapaneseAnalyzer(\n            \/\/ \u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u8a2d\u5b9a\u3092\u53d6\u5f97\n            JapaneseTokenizer.DEFAULT_MODE,\n            \/\/ \u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u30b9\u30c6\u30c3\u30d7\u3092\u53d6\u5f97\n            JapaneseAnalyzer.getDefaultStopTags(),\n            \/\/ \u30b9\u30c8\u30c3\u30d7\u30ef\u30fc\u30c9\u306e\u8ffd\u52a0\n            getCustomStopWords()\n        );\n    }\n\n    private static CharArraySet getCustomStopWords() {\n        Set&lt;String&gt; stopWords = new HashSet&lt;&gt;(Arrays.asList(\n            \"\u306e\", \"\u306b\", \"\u306f\", \"\u3092\", \"\u305f\", \"\u304c\", \"\u3067\", \"\u3066\", \"\u3068\", \"\u3057\", \"\u308c\", \"\u3055\",\n            \"\u3042\u308b\", \"\u3044\u308b\", \"\u3068\u3044\u3046\", \"\u3055\u308c\u305f\", \"\u3055\u308c\u308b\", \"\u3067\u304d\u308b\", \"\u3057\u3066\u3044\u308b\",\n            \"\u3067\u3059\", \"\u307e\u3059\", \"\u3067\u3057\", \"\u307e\u3057\"\n        ));\n        return new CharArraySet(stopWords, true);\n    }\n}\n\n\/\/ \u5b9f\u88c5\u4f8b\npublic class JapaneseSearcher {\n    private final IndexSearcher searcher;\n    private final Analyzer analyzer;\n\n    public JapaneseSearcher(String indexPath) throws IOException {\n        this.analyzer = JapaneseSearchConfig.createOptimizedAnalyzer();\n        Directory directory = FSDirectory.open(Paths.get(indexPath));\n        IndexReader reader = DirectoryReader.open(directory);\n        this.searcher = new IndexSearcher(reader);\n    }\n\n    public List&lt;Document&gt; searchWithReading(String keyword) throws IOException {\n        \/\/ \u8aad\u307f\u4eee\u540d\u3067\u306e\u691c\u7d22\u306b\u5bfe\u5fdc\n        TokenStream stream = analyzer.tokenStream(\"content\", keyword);\n        CharTermAttribute termAtt = stream.addAttribute(CharTermAttribute.class);\n        ReadingAttribute readingAtt = stream.addAttribute(ReadingAttribute.class);\n\n        BooleanQuery.Builder queryBuilder = new BooleanQuery.Builder();\n        stream.reset();\n\n        while (stream.incrementToken()) {\n            String term = termAtt.toString();\n            String reading = readingAtt.getReading();\n\n            if (reading != null) {\n                queryBuilder.add(new TermQuery(new Term(\"reading\", reading)), \n                               BooleanClause.Occur.SHOULD);\n            }\n            queryBuilder.add(new TermQuery(new Term(\"content\", term)), \n                           BooleanClause.Occur.SHOULD);\n        }\n\n        TopDocs results = searcher.search(queryBuilder.build(), 10);\n        return Arrays.stream(results.scoreDocs)\n                    .map(scoreDoc -&gt; {\n                        try {\n                            return searcher.doc(scoreDoc.doc);\n                        } catch (IOException e) {\n                            throw new RuntimeException(e);\n                        }\n                    })\n                    .collect(Collectors.toList());\n    }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-32\">\u30d5\u30a1\u30bb\u30c3\u30c8\u691c\u7d22\u306e\u5b9f\u88c5\u624b\u9806<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-33\">1. \u30d5\u30a1\u30bb\u30c3\u30c8\u30d5\u30a3\u30fc\u30eb\u30c9\u306e\u8a2d\u5b9a<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class FacetSearchManager {\n    private final FacetsConfig config;\n    private final DirectoryTaxonomyWriter taxoWriter;\n    private final IndexWriter indexWriter;\n\n    public FacetSearchManager(String indexPath, String taxoPath) throws IOException {\n        this.config = new FacetsConfig();\n        \/\/ \u30ab\u30c6\u30b4\u30ea\u30fc\u306e\u968e\u5c64\u3092\u8a2d\u5b9a\n        config.setHierarchical(\"category\", true);\n        config.setMultiValued(\"tags\", true);\n\n        Directory indexDir = FSDirectory.open(Paths.get(indexPath));\n        Directory taxoDir = FSDirectory.open(Paths.get(taxoPath));\n\n        IndexWriterConfig iwConfig = new IndexWriterConfig(new JapaneseAnalyzer());\n        this.indexWriter = new IndexWriter(indexDir, iwConfig);\n        this.taxoWriter = new DirectoryTaxonomyWriter(taxoDir);\n    }\n\n    public void addDocument(String title, String content, \n                          String category, List&lt;String&gt; tags) throws IOException {\n        Document doc = new Document();\n        doc.add(new TextField(\"title\", title, Field.Store.YES));\n        doc.add(new TextField(\"content\", content, Field.Store.YES));\n\n        \/\/ \u30d5\u30a1\u30bb\u30c3\u30c8\u30d5\u30a3\u30fc\u30eb\u30c9\u306e\u8ffd\u52a0\n        doc.add(new FacetField(\"category\", category.split(\"\/\")));\n        for (String tag : tags) {\n            doc.add(new FacetField(\"tags\", tag));\n        }\n\n        indexWriter.addDocument(config.build(taxoWriter, doc));\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-34\">2. \u30d5\u30a1\u30bb\u30c3\u30c8\u691c\u7d22\u306e\u5b9f\u884c<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class FacetSearchExecutor {\n    private final IndexSearcher searcher;\n    private final TaxonomyReader taxoReader;\n    private final FacetsConfig config;\n\n    public FacetSearchResults search(String queryStr, \n                                   int maxHits) throws IOException {\n        QueryParser parser = new QueryParser(\"content\", new JapaneseAnalyzer());\n        Query baseQuery = parser.parse(queryStr);\n\n        \/\/ \u30d5\u30a1\u30bb\u30c3\u30c8\u30b3\u30ec\u30af\u30bf\u30fc\u306e\u8a2d\u5b9a\n        FacetsCollector fc = new FacetsCollector();\n        TopDocs topDocs = FacetsCollector.search(searcher, baseQuery, \n                                                maxHits, fc);\n\n        \/\/ \u30ab\u30c6\u30b4\u30ea\u30fc\u30d5\u30a1\u30bb\u30c3\u30c8\u306e\u53d6\u5f97\n        Facets categoryCounts = new FastTaxonomyFacetCounts(\n            taxoReader, config, fc, new CountFacetRequest(\"category\", 10)\n        );\n\n        \/\/ \u30bf\u30b0\u30d5\u30a1\u30bb\u30c3\u30c8\u306e\u53d6\u5f97\n        Facets tagCounts = new FastTaxonomyFacetCounts(\n            taxoReader, config, fc, new CountFacetRequest(\"tags\", 20)\n        );\n\n        return new FacetSearchResults(\n            topDocs,\n            categoryCounts.getTopChildren(10, \"category\"),\n            tagCounts.getTopChildren(20, \"tags\")\n        );\n    }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-35\">\u30b9\u30b3\u30a2\u30ea\u30f3\u30b0\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u65b9\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-36\">1. \u30ab\u30b9\u30bf\u30e0\u30b9\u30b3\u30a2\u30ea\u30f3\u30b0\u95a2\u6570\u306e\u5b9f\u88c5<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class CustomScoreProvider extends ScoreProvider {\n    private final Explanation baseExplanation;\n    private final float boost;\n    private final long timestamp;\n\n    public CustomScoreProvider(Explanation baseExplanation, \n                             float boost, long timestamp) {\n        this.baseExplanation = baseExplanation;\n        this.boost = boost;\n        this.timestamp = timestamp;\n    }\n\n    @Override\n    public float score() {\n        float baseScore = baseExplanation.getValue().floatValue();\n        \/\/ \u6642\u9593\u6e1b\u8870\u3092\u8003\u616e\u3057\u305f\u30b9\u30b3\u30a2\u8a08\u7b97\n        float timeBoost = calculateTimeBoost(timestamp);\n        return baseScore * boost * timeBoost;\n    }\n\n    private float calculateTimeBoost(long timestamp) {\n        long now = System.currentTimeMillis();\n        long diff = now - timestamp;\n        \/\/ 1\u9031\u9593\u3092\u57fa\u6e96\u3068\u3057\u305f\u6e1b\u8870\n        float daysOld = diff \/ (1000f * 60f * 60f * 24f);\n        return (float) Math.exp(-daysOld \/ 7.0);\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-37\">2. \u30d6\u30fc\u30b9\u30c8\u5024\u306e\u52d5\u7684\u8abf\u6574<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class DynamicBoostSearcher {\n    private final IndexSearcher searcher;\n\n    public TopDocs searchWithDynamicBoost(String queryStr) throws IOException {\n        \/\/ \u30af\u30a8\u30ea\u306e\u69cb\u7bc9\n        BooleanQuery.Builder queryBuilder = new BooleanQuery.Builder();\n\n        \/\/ \u30bf\u30a4\u30c8\u30eb\u30d5\u30a3\u30fc\u30eb\u30c9\u306e\u91cd\u307f\u4ed8\u3051\n        BoostQuery titleQuery = new BoostQuery(\n            new TermQuery(new Term(\"title\", queryStr)), 2.0f\n        );\n        queryBuilder.add(titleQuery, BooleanClause.Occur.SHOULD);\n\n        \/\/ \u30b3\u30f3\u30c6\u30f3\u30c4\u30d5\u30a3\u30fc\u30eb\u30c9\u306e\u91cd\u307f\u4ed8\u3051\n        queryBuilder.add(\n            new TermQuery(new Term(\"content\", queryStr)), \n            BooleanClause.Occur.SHOULD\n        );\n\n        \/\/ \u30ab\u30b9\u30bf\u30e0\u30b3\u30ec\u30af\u30bf\u30fc\u306e\u4f7f\u7528\n        CollectorManager&lt;TopScoreDocCollector, TopDocs&gt; collectorManager = \n            new CollectorManager&lt;&gt;() {\n                @Override\n                public TopScoreDocCollector newCollector() {\n                    return TopScoreDocCollector.create(10, null);\n                }\n\n                @Override\n                public TopDocs reduce(Collection&lt;TopScoreDocCollector&gt; collectors) {\n                    \/\/ \u30b9\u30b3\u30a2\u306e\u96c6\u7d04\u3068\u30bd\u30fc\u30c8\n                    return TopDocs.merge(\n                        0, 10, \n                        collectors.stream()\n                                .map(TopScoreDocCollector::topDocs)\n                                .collect(Collectors.toList())\n                    );\n                }\n            };\n\n        return searcher.search(queryBuilder.build(), collectorManager);\n    }\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u88c5\u30c6\u30af\u30cb\u30c3\u30af\u306f\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u5229\u70b9\u304c\u3042\u308a\u307e\u3059\uff1a<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt\">\u5229\u70b9<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u9ad8\u5ea6\u306a\u65e5\u672c\u8a9e\u691c\u7d22<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u5f62\u614b\u7d20\u89e3\u6790\u306b\u3088\u308b\u7cbe\u5ea6\u306e\u5411\u4e0a<\/li>\n\n\n\n<li>\u8aad\u307f\u4eee\u540d\u691c\u7d22\u3078\u306e\u5bfe\u5fdc<\/li>\n\n\n\n<li>\u30ab\u30b9\u30bf\u30e0\u30b9\u30c8\u30c3\u30d7\u30ef\u30fc\u30c9\u306e\u9069\u7528<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u30d5\u30a1\u30bb\u30c3\u30c8\u691c\u7d22<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u30ab\u30c6\u30b4\u30ea\u30fc\u5225\u306e\u7d5e\u308a\u8fbc\u307f<\/li>\n\n\n\n<li>\u8907\u6570\u5024\u30d5\u30a3\u30fc\u30eb\u30c9\u306e\u5bfe\u5fdc<\/li>\n\n\n\n<li>\u968e\u5c64\u69cb\u9020\u306e\u5b9f\u73fe<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u30ab\u30b9\u30bf\u30e0\u30b9\u30b3\u30a2\u30ea\u30f3\u30b0<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u6642\u9593\u306b\u3088\u308b\u91cd\u307f\u4ed8\u3051<\/li>\n\n\n\n<li>\u30d5\u30a3\u30fc\u30eb\u30c9\u5225\u306e\u30d6\u30fc\u30b9\u30c8<\/li>\n\n\n\n<li>\u52d5\u7684\u306a\u30b9\u30b3\u30a2\u8abf\u6574<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u6a5f\u80fd\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u9ad8\u5ea6\u306a\u691c\u7d22\u30b7\u30b9\u30c6\u30e0\u3092\u69cb\u7bc9\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"i-38\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e7\u3064\u306e\u30c6\u30af\u30cb\u30c3\u30af<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-39\">\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u8a2d\u8a08\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-40\">1. \u30d5\u30a3\u30fc\u30eb\u30c9\u8a2d\u8a08\u306e\u6700\u9069\u5316<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class OptimizedDocument {\n    public static Document create(String id, String title, String content, \n                                Map&lt;String, String&gt; metadata) {\n        Document doc = new Document();\n\n        \/\/ \u691c\u7d22\u7528\u30d5\u30a3\u30fc\u30eb\u30c9\uff08\u30c6\u30ad\u30b9\u30c8\u5206\u6790\u3042\u308a\u3001\u4fdd\u5b58\u306a\u3057\uff09\n        doc.add(new TextField(\"content_index\", content, Field.Store.NO));\n\n        \/\/ \u8868\u793a\u7528\u30d5\u30a3\u30fc\u30eb\u30c9\uff08\u30c6\u30ad\u30b9\u30c8\u5206\u6790\u306a\u3057\u3001\u4fdd\u5b58\u3042\u308a\uff09\n        doc.add(new StoredField(\"content_display\", content));\n\n        \/\/ \u9ad8\u901f\u30d5\u30a3\u30eb\u30bf\u30ea\u30f3\u30b0\u7528\u30d5\u30a3\u30fc\u30eb\u30c9\n        doc.add(new StringField(\"id\", id, Field.Store.YES));\n\n        \/\/ \u30e1\u30bf\u30c7\u30fc\u30bf\u306e\u52b9\u7387\u7684\u306a\u4fdd\u5b58\n        metadata.forEach((key, value) -&gt; \n            doc.add(new StoredField(\"meta_\" + key, value))\n        );\n\n        return doc;\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-41\">2. \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u30bb\u30b0\u30e1\u30f3\u30c8\u306e\u6700\u9069\u5316<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class IndexOptimizer {\n    private final IndexWriter writer;\n\n    public void optimizeIndex() throws IOException {\n        \/\/ \u30de\u30fc\u30b8\u30dd\u30ea\u30b7\u30fc\u306e\u8a2d\u5b9a\n        LogMergePolicy mergePolicy = new LogMergePolicy();\n        mergePolicy.setMergeFactor(10);\n        mergePolicy.setMaxMergeDocs(1000000);\n\n        writer.getConfig().setMergePolicy(mergePolicy);\n\n        \/\/ \u5f37\u5236\u30de\u30fc\u30b8\u306e\u5b9f\u884c\n        writer.forceMerge(1);\n    }\n\n    public void scheduleOptimization() {\n        \/\/ \u5b9a\u671f\u7684\u306a\u6700\u9069\u5316\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\n        ScheduledExecutorService scheduler = \n            Executors.newScheduledThreadPool(1);\n\n        scheduler.scheduleAtFixedRate(() -&gt; {\n            try {\n                if (writer.numDocs() &gt; 1000000) {\n                    optimizeIndex();\n                }\n            } catch (IOException e) {\n                \/\/ \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\n            }\n        }, 1, 24, TimeUnit.HOURS);\n    }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-42\">\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-43\">3. \u30d5\u30a3\u30fc\u30eb\u30c9\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u6700\u9069\u5316<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class CacheOptimizer {\n    private final Directory directory;\n    private final DirectoryReader reader;\n    private final Map&lt;String, Filter&gt; filterCache;\n\n    public CacheOptimizer(String indexPath) throws IOException {\n        this.directory = FSDirectory.open(Paths.get(indexPath));\n        this.reader = DirectoryReader.open(directory);\n        this.filterCache = new ConcurrentHashMap&lt;&gt;();\n    }\n\n    public Filter getOrCreateFilter(String field, String value) {\n        String cacheKey = field + \":\" + value;\n        return filterCache.computeIfAbsent(cacheKey, k -&gt; {\n            Query query = new TermQuery(new Term(field, value));\n            return new QueryWrapperFilter(query);\n        });\n    }\n\n    public void warmUpCache(List&lt;String&gt; commonFields) throws IOException {\n        \/\/ \u983b\u7e41\u306b\u4f7f\u7528\u3055\u308c\u308b\u30d5\u30a3\u30fc\u30eb\u30c9\u306e\u30d7\u30ea\u30ed\u30fc\u30c9\n        for (String field : commonFields) {\n            Terms terms = MultiTerms.getTerms(reader, field);\n            TermsEnum termsEnum = terms.iterator();\n            BytesRef term;\n            while ((term = termsEnum.next()) != null) {\n                getOrCreateFilter(field, term.utf8ToString());\n            }\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-44\">4. \u30af\u30a8\u30ea\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u5b9f\u88c5<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class QueryCache {\n    private final LoadingCache&lt;String, Query&gt; queryCache;\n    private final QueryParser parser;\n\n    public QueryCache(Analyzer analyzer) {\n        this.parser = new QueryParser(\"content\", analyzer);\n\n        this.queryCache = CacheBuilder.newBuilder()\n            .maximumSize(1000)\n            .expireAfterWrite(1, TimeUnit.HOURS)\n            .build(new CacheLoader&lt;String, Query&gt;() {\n                @Override\n                public Query load(String queryString) throws Exception {\n                    return parser.parse(queryString);\n                }\n            });\n    }\n\n    public Query getQuery(String queryString) {\n        try {\n            return queryCache.get(queryString);\n        } catch (ExecutionException e) {\n            \/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u30df\u30b9\u6642\u306e\u30d5\u30a9\u30fc\u30eb\u30d0\u30c3\u30af\n            try {\n                return parser.parse(queryString);\n            } catch (ParseException pe) {\n                throw new RuntimeException(pe);\n            }\n        }\n    }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-45\">\u4e26\u5217\u51e6\u7406\u306b\u3088\u308b\u691c\u7d22\u306e\u9ad8\u901f\u5316<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-46\">5. \u30de\u30eb\u30c1\u30b9\u30ec\u30c3\u30c9\u691c\u7d22\u306e\u5b9f\u88c5<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class ParallelSearchExecutor {\n    private final IndexSearcher searcher;\n    private final ExecutorService executor;\n\n    public ParallelSearchExecutor(IndexReader reader) {\n        this.executor = Executors.newFixedThreadPool(\n            Runtime.getRuntime().availableProcessors()\n        );\n        this.searcher = new IndexSearcher(reader, executor);\n    }\n\n    public List&lt;Document&gt; parallelSearch(List&lt;Query&gt; queries) {\n        List&lt;CompletableFuture&lt;TopDocs&gt;&gt; futures = queries.stream()\n            .map(query -&gt; CompletableFuture.supplyAsync(() -&gt; {\n                try {\n                    return searcher.search(query, 10);\n                } catch (IOException e) {\n                    throw new CompletionException(e);\n                }\n            }, executor))\n            .collect(Collectors.toList());\n\n        return futures.stream()\n            .map(CompletableFuture::join)\n            .flatMap(topDocs -&gt; Arrays.stream(topDocs.scoreDocs))\n            .map(scoreDoc -&gt; {\n                try {\n                    return searcher.doc(scoreDoc.doc);\n                } catch (IOException e) {\n                    throw new RuntimeException(e);\n                }\n            })\n            .collect(Collectors.toList());\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-47\">6. \u30d0\u30eb\u30af\u51e6\u7406\u306e\u6700\u9069\u5316<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class BulkProcessor {\n    private final IndexWriter writer;\n    private final int batchSize;\n    private final List&lt;Document&gt; batch;\n\n    public BulkProcessor(IndexWriter writer, int batchSize) {\n        this.writer = writer;\n        this.batchSize = batchSize;\n        this.batch = new ArrayList&lt;&gt;(batchSize);\n    }\n\n    public void addDocument(Document doc) throws IOException {\n        batch.add(doc);\n\n        if (batch.size() &gt;= batchSize) {\n            flush();\n        }\n    }\n\n    public void flush() throws IOException {\n        if (batch.isEmpty()) {\n            return;\n        }\n\n        \/\/ \u30d0\u30c3\u30c1\u51e6\u7406\u306e\u5b9f\u884c\n        writer.addDocuments(batch);\n        batch.clear();\n\n        \/\/ \u30b3\u30df\u30c3\u30c8\u306e\u5236\u5fa1\n        if (writer.ramBytesUsed() &gt; 256 * 1024 * 1024) {\n            writer.commit();\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-48\">7. \u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u6700\u9069\u5316<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class MemoryOptimizer {\n    private final IndexWriter writer;\n\n    public void configureMemoryUsage() {\n        IndexWriterConfig config = writer.getConfig();\n\n        \/\/ RAM\u30d0\u30c3\u30d5\u30a1\u30b5\u30a4\u30ba\u306e\u8a2d\u5b9a\n        config.setRAMBufferSizeMB(256.0);\n\n        \/\/ \u6700\u5927\u30d0\u30c3\u30d5\u30a1\u30fc\u30c9\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u6570\u306e\u8a2d\u5b9a\n        config.setMaxBufferedDocs(10000);\n\n        \/\/ \u30de\u30fc\u30b8\u30dd\u30ea\u30b7\u30fc\u306e\u8a2d\u5b9a\n        TieredMergePolicy mergePolicy = new TieredMergePolicy();\n        mergePolicy.setMaxMergeAtOnce(10);\n        mergePolicy.setSegmentsPerTier(10);\n        config.setMergePolicy(mergePolicy);\n\n        \/\/ \u30de\u30fc\u30b8\u30b9\u30b1\u30b8\u30e5\u30fc\u30e9\u306e\u8a2d\u5b9a\n        ConcurrentMergeScheduler mergeScheduler = \n            (ConcurrentMergeScheduler) config.getMergeScheduler();\n        mergeScheduler.setMaxMergeCount(\n            Math.max(1, Runtime.getRuntime().availableProcessors() \/ 2)\n        );\n    }\n\n    public void monitorMemoryUsage() {\n        MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();\n        MemoryUsage heapUsage = memoryBean.getHeapMemoryUsage();\n\n        if (heapUsage.getUsed() &gt; heapUsage.getMax() * 0.8) {\n            \/\/ \u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u304c80%\u3092\u8d85\u3048\u305f\u5834\u5408\u306e\u51e6\u7406\n            try {\n                writer.commit();\n                System.gc();\n            } catch (IOException e) {\n                \/\/ \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\n            }\n        }\n    }\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u6700\u9069\u5316\u30c6\u30af\u30cb\u30c3\u30af\u3092\u9069\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u52b9\u679c\u304c\u671f\u5f85\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt\">\u671f\u5f85\u3055\u308c\u308b\u52b9\u679c<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u5411\u4e0a\n<ul class=\"wp-block-list\">\n<li>\u52b9\u7387\u7684\u306a\u30d5\u30a3\u30fc\u30eb\u30c9\u8a2d\u8a08<\/li>\n\n\n\n<li>\u6700\u9069\u306a\u30bb\u30b0\u30e1\u30f3\u30c8\u7ba1\u7406<\/li>\n\n\n\n<li>\u30c7\u30a3\u30b9\u30afI\/O\u306e\u524a\u6e1b<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u691c\u7d22\u901f\u5ea6\u306e\u6539\u5584\n<ul class=\"wp-block-list\">\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565\u306e\u6d3b\u7528<\/li>\n\n\n\n<li>\u4e26\u5217\u51e6\u7406\u306e\u5c0e\u5165<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u306e\u6700\u9069\u5316<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u30b7\u30b9\u30c6\u30e0\u306e\u5b89\u5b9a\u6027\u5411\u4e0a\n<ul class=\"wp-block-list\">\n<li>\u30ea\u30bd\u30fc\u30b9\u4f7f\u7528\u306e\u52b9\u7387\u5316<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u5f37\u5316<\/li>\n\n\n\n<li>\u76e3\u8996\u6a5f\u80fd\u306e\u5b9f\u88c5<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30c6\u30af\u30cb\u30c3\u30af\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u5927\u898f\u6a21\u306a\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u3067\u3082\u9ad8\u901f\u3067\u5b89\u5b9a\u3057\u305f\u691c\u7d22\u30b7\u30b9\u30c6\u30e0\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"i-49\">\u904b\u7528\u74b0\u5883\u3067\u306e\u6ce8\u610f\u70b9\u3068\u76e3\u8996\u65b9\u6cd5<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-50\">\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u6700\u9069\u5316\u3068\u76e3\u8996<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-51\">\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u5b9f\u88c5<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class LuceneMonitor {\n    private final IndexWriter writer;\n    private final MetricRegistry metrics;\n    private final JmxReporter reporter;\n\n    public LuceneMonitor(IndexWriter writer) {\n        this.writer = writer;\n        this.metrics = new MetricRegistry();\n\n        \/\/ JMX\u30ec\u30dd\u30fc\u30bf\u30fc\u306e\u8a2d\u5b9a\n        this.reporter = JmxReporter.forRegistry(metrics)\n            .convertRatesTo(TimeUnit.SECONDS)\n            .convertDurationsTo(TimeUnit.MILLISECONDS)\n            .build();\n\n        setupMetrics();\n        reporter.start();\n    }\n\n    private void setupMetrics() {\n        \/\/ \u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u8a08\u6e2c\n        metrics.register(\"lucene.memory.heap\",\n            (Gauge&lt;Long&gt;) () -&gt; ManagementFactory.getMemoryMXBean()\n                                               .getHeapMemoryUsage()\n                                               .getUsed());\n\n        \/\/ \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u30b5\u30a4\u30ba\u306e\u8a08\u6e2c\n        metrics.register(\"lucene.index.size\",\n            (Gauge&lt;Long&gt;) () -&gt; writer.ramBytesUsed());\n\n        \/\/ \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u6570\u306e\u8a08\u6e2c\n        metrics.register(\"lucene.documents.count\",\n            (Gauge&lt;Integer&gt;) () -&gt; writer.numDocs());\n    }\n\n    public void checkMemoryThresholds() {\n        MemoryUsage heapUsage = ManagementFactory.getMemoryMXBean()\n                                                .getHeapMemoryUsage();\n        long usedMemory = heapUsage.getUsed();\n        long maxMemory = heapUsage.getMax();\n\n        \/\/ \u30e1\u30e2\u30ea\u4f7f\u7528\u7387\u306e\u8a08\u7b97\n        double memoryUsageRatio = (double) usedMemory \/ maxMemory;\n\n        if (memoryUsageRatio &gt; 0.8) {\n            \/\/ \u8b66\u544a\u30a2\u30e9\u30fc\u30c8\u306e\u767a\u884c\n            notifyHighMemoryUsage(memoryUsageRatio);\n\n            \/\/ \u7dca\u6025\u30e1\u30e2\u30ea\u89e3\u653e\u51e6\u7406\n            performEmergencyMemoryRelease();\n        }\n    }\n\n    private void performEmergencyMemoryRelease() {\n        try {\n            \/\/ \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u30b3\u30df\u30c3\u30c8\n            writer.commit();\n\n            \/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u30af\u30ea\u30a2\n            writer.getConfig().getWarmer().clear();\n\n            \/\/ GC\u306e\u5b9f\u884c\u3092\u63d0\u6848\n            System.gc();\n        } catch (IOException e) {\n            \/\/ \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-52\">\u30e1\u30e2\u30ea\u30ea\u30fc\u30af\u9632\u6b62\u7b56<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class ResourceManager implements AutoCloseable {\n    private final List&lt;AutoCloseable&gt; resources;\n    private final Timer cleanupTimer;\n\n    public ResourceManager() {\n        this.resources = new CopyOnWriteArrayList&lt;&gt;();\n        this.cleanupTimer = new Timer(true);\n\n        \/\/ \u5b9a\u671f\u7684\u306a\u30ea\u30bd\u30fc\u30b9\u30c1\u30a7\u30c3\u30af\n        cleanupTimer.scheduleAtFixedRate(new TimerTask() {\n            @Override\n            public void run() {\n                checkResourceLeaks();\n            }\n        }, 0, TimeUnit.MINUTES.toMillis(30));\n    }\n\n    public void registerResource(AutoCloseable resource) {\n        resources.add(resource);\n    }\n\n    private void checkResourceLeaks() {\n        List&lt;AutoCloseable&gt; closedResources = new ArrayList&lt;&gt;();\n\n        for (AutoCloseable resource : resources) {\n            if (isResourceClosed(resource)) {\n                closedResources.add(resource);\n            }\n        }\n\n        resources.removeAll(closedResources);\n    }\n\n    @Override\n    public void close() {\n        cleanupTimer.cancel();\n\n        for (AutoCloseable resource : resources) {\n            try {\n                resource.close();\n            } catch (Exception e) {\n                \/\/ \u30a8\u30e9\u30fc\u30ed\u30b0\u8a18\u9332\n            }\n        }\n\n        resources.clear();\n    }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-53\">\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u3068\u5fa9\u65e7\u624b\u9806<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-54\">\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u7ba1\u7406\u30b7\u30b9\u30c6\u30e0<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class IndexBackupManager {\n    private final Path indexPath;\n    private final Path backupPath;\n    private final IndexWriter writer;\n\n    public void createBackup() throws IOException {\n        \/\/ \u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u524d\u306e\u6e96\u5099\n        writer.commit();\n\n        \/\/ \u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u306e\u4f5c\u6210\n        IndexCommit snapshot = DirectoryReader.open(writer)\n                                            .getIndexCommit();\n\n        \/\/ \u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u6e96\u5099\n        Path timestampedBackupPath = backupPath.resolve(\n            LocalDateTime.now().format(\n                DateTimeFormatter.ofPattern(\"yyyyMMdd_HHmmss\")\n            )\n        );\n        Files.createDirectories(timestampedBackupPath);\n\n        \/\/ \u30d5\u30a1\u30a4\u30eb\u306e\u30b3\u30d4\u30fc\n        for (String fileName : snapshot.getFileNames()) {\n            Path source = indexPath.resolve(fileName);\n            Path target = timestampedBackupPath.resolve(fileName);\n            Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);\n        }\n\n        \/\/ \u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u30e1\u30bf\u30c7\u30fc\u30bf\u306e\u4fdd\u5b58\n        saveBackupMetadata(timestampedBackupPath, snapshot);\n    }\n\n    private void saveBackupMetadata(Path backupPath, \n                                  IndexCommit snapshot) throws IOException {\n        Map&lt;String, String&gt; metadata = new HashMap&lt;&gt;();\n        metadata.put(\"timestamp\", \n            LocalDateTime.now().toString());\n        metadata.put(\"segmentCount\", \n            String.valueOf(snapshot.getSegmentCount()));\n        metadata.put(\"generation\", \n            String.valueOf(snapshot.getGeneration()));\n\n        Path metadataPath = backupPath.resolve(\"backup.meta\");\n        try (BufferedWriter writer = Files.newBufferedWriter(metadataPath)) {\n            for (Map.Entry&lt;String, String&gt; entry : metadata.entrySet()) {\n                writer.write(entry.getKey() + \"=\" + entry.getValue());\n                writer.newLine();\n            }\n        }\n    }\n\n    public void restoreFromBackup(Path backupPath) throws IOException {\n        \/\/ \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u30af\u30ed\u30fc\u30ba\n        writer.close();\n\n        \/\/ \u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u304b\u3089\u306e\u5fa9\u5143\n        try (Stream&lt;Path&gt; files = Files.list(backupPath)) {\n            files.forEach(source -&gt; {\n                try {\n                    Path target = indexPath.resolve(source.getFileName());\n                    Files.copy(source, target, \n                        StandardCopyOption.REPLACE_EXISTING);\n                } catch (IOException e) {\n                    throw new UncheckedIOException(e);\n                }\n            });\n        }\n    }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-55\">\u6027\u80fd\u52a3\u5316\u306e\u4e88\u9632\u3068\u5bfe\u7b56\u65b9\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-56\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u76e3\u8996\u30b7\u30b9\u30c6\u30e0<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class PerformanceMonitor {\n    private final Counter searchRequests;\n    private final Timer searchLatency;\n    private final Histogram resultSizes;\n\n    public PerformanceMonitor(MetricRegistry metrics) {\n        this.searchRequests = metrics.counter(\"search.requests\");\n        this.searchLatency = metrics.timer(\"search.latency\");\n        this.resultSizes = metrics.histogram(\"search.results.size\");\n    }\n\n    public &lt;T&gt; T monitorSearchOperation(Callable&lt;T&gt; searchOperation) \n            throws Exception {\n        searchRequests.inc();\n\n        try (Timer.Context context = searchLatency.time()) {\n            T result = searchOperation.call();\n\n            if (result instanceof TopDocs) {\n                resultSizes.update(((TopDocs) result).totalHits.value);\n            }\n\n            return result;\n        }\n    }\n\n    public void analyzePerformance() {\n        Snapshot latencyStats = searchLatency.getSnapshot();\n\n        \/\/ \u6027\u80fd\u6307\u6a19\u306e\u8a08\u7b97\n        double median = latencyStats.getMedian();\n        double p95 = latencyStats.get95thPercentile();\n        double p99 = latencyStats.get99thPercentile();\n\n        \/\/ \u6027\u80fd\u52a3\u5316\u306e\u691c\u77e5\n        if (p95 &gt; TimeUnit.MILLISECONDS.toNanos(500)) {\n            \/\/ \u8b66\u544a\u30a2\u30e9\u30fc\u30c8\u306e\u767a\u884c\n            notifyPerformanceDegradation(p95);\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-57\">\u81ea\u52d5\u6700\u9069\u5316\u30b9\u30b1\u30b8\u30e5\u30fc\u30e9\u30fc<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class OptimizationScheduler {\n    private final IndexWriter writer;\n    private final ScheduledExecutorService scheduler;\n    private final PerformanceMonitor monitor;\n\n    public OptimizationScheduler(IndexWriter writer, \n                               PerformanceMonitor monitor) {\n        this.writer = writer;\n        this.monitor = monitor;\n        this.scheduler = Executors.newScheduledThreadPool(1);\n\n        scheduleOptimizations();\n    }\n\n    private void scheduleOptimizations() {\n        \/\/ \u5b9a\u671f\u7684\u306a\u6700\u9069\u5316\u30bf\u30b9\u30af\n        scheduler.scheduleAtFixedRate(() -&gt; {\n            try {\n                if (shouldOptimize()) {\n                    performOptimization();\n                }\n            } catch (IOException e) {\n                \/\/ \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\n            }\n        }, 1, 24, TimeUnit.HOURS);\n\n        \/\/ \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u76e3\u8996\u30bf\u30b9\u30af\n        scheduler.scheduleAtFixedRate(() -&gt; {\n            monitor.analyzePerformance();\n        }, 5, 5, TimeUnit.MINUTES);\n    }\n\n    private boolean shouldOptimize() throws IOException {\n        \/\/ \u6700\u9069\u5316\u306e\u5224\u65ad\u57fa\u6e96\n        return writer.numDocs() &gt; 1_000_000 || \n               writer.getConfig().getMergePolicy()\n                     .findMerges(null, writer.getSegmentInfos(), writer) != null;\n    }\n\n    private void performOptimization() throws IOException {\n        \/\/ \u30bb\u30b0\u30e1\u30f3\u30c8\u306e\u5f37\u5236\u30de\u30fc\u30b8\n        writer.forceMerge(1);\n\n        \/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u66f4\u65b0\n        writer.getConfig().getWarmer().warmUp(writer.getSegmentInfos());\n    }\n}<\/pre>\n\n\n\n<p>\u904b\u7528\u74b0\u5883\u3067\u306e\u4e3b\u306a\u6ce8\u610f\u70b9\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\uff1a<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-exclamation-alt\">\u6ce8\u610f\u70b9<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30e1\u30e2\u30ea\u7ba1\u7406<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u5b9a\u671f\u7684\u306a\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30bf\u30a4\u30df\u30f3\u30b0\u3067\u306e\u30ea\u30bd\u30fc\u30b9\u89e3\u653e<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u30ea\u30fc\u30af\u306e\u9632\u6b62\u7b56<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u6226\u7565<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u5b9a\u671f\u7684\u306a\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u30d0\u30c3\u30af\u30a2\u30c3\u30d7<\/li>\n\n\n\n<li>\u30e1\u30bf\u30c7\u30fc\u30bf\u306e\u4fdd\u5b58<\/li>\n\n\n\n<li>\u8fc5\u901f\u306a\u5fa9\u65e7\u624b\u9806\u306e\u78ba\u7acb<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u6027\u80fd\u76e3\u8996<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u691c\u7d22\u30ec\u30a4\u30c6\u30f3\u30b7\u30fc\u306e\u76e3\u8996<\/li>\n\n\n\n<li>\u7d50\u679c\u30b5\u30a4\u30ba\u306e\u5206\u6790<\/li>\n\n\n\n<li>\u81ea\u52d5\u6700\u9069\u5316\u306e\u5b9f\u65bd<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u65bd\u7b56\u3092\u9069\u5207\u306b\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\u3001\u5b89\u5b9a\u3057\u305f\u904b\u7528\u74b0\u5883\u3092\u7dad\u6301\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"i-58\">\u767a\u5c55\u7684\u306a\u4f7f\u3044\u65b9\u3068\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-59\">\u985e\u4f3c\u6587\u66f8\u691c\u7d22\u306e\u5b9f\u88c5\u4f8b<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-60\">MoreLikeThis\u306b\u3088\u308b\u985e\u4f3c\u5ea6\u8a08\u7b97<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class SimilarDocumentFinder {\n    private final IndexSearcher searcher;\n    private final MoreLikeThis moreLikeThis;\n\n    public SimilarDocumentFinder(IndexReader reader) {\n        this.searcher = new IndexSearcher(reader);\n        this.moreLikeThis = new MoreLikeThis(reader);\n\n        \/\/ \u985e\u4f3c\u5ea6\u8a08\u7b97\u306e\u8a2d\u5b9a\n        moreLikeThis.setFieldNames(new String[]{\"title\", \"content\"});\n        moreLikeThis.setMinTermFreq(2);\n        moreLikeThis.setMinDocFreq(2);\n        moreLikeThis.setMaxQueryTerms(25);\n        moreLikeThis.setMinWordLen(4);\n    }\n\n    public List&lt;SimilarDocument&gt; findSimilarDocuments(int docId) \n            throws IOException {\n        \/\/ \u5bfe\u8c61\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u53d6\u5f97\n        Document doc = searcher.doc(docId);\n\n        \/\/ \u985e\u4f3c\u5ea6\u30af\u30a8\u30ea\u306e\u751f\u6210\n        Query query = moreLikeThis.like(docId);\n\n        \/\/ \u985e\u4f3c\u6587\u66f8\u306e\u691c\u7d22\n        TopDocs topDocs = searcher.search(query, 10);\n\n        return Arrays.stream(topDocs.scoreDocs)\n            .filter(scoreDoc -&gt; scoreDoc.doc != docId)\n            .map(scoreDoc -&gt; {\n                try {\n                    Document similar = searcher.doc(scoreDoc.doc);\n                    return new SimilarDocument(\n                        similar.get(\"title\"),\n                        similar.get(\"content\"),\n                        scoreDoc.score\n                    );\n                } catch (IOException e) {\n                    throw new RuntimeException(e);\n                }\n            })\n            .collect(Collectors.toList());\n    }\n\n    public static class SimilarDocument {\n        private final String title;\n        private final String content;\n        private final float similarity;\n\n        \/\/ \u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u3068\u30b2\u30c3\u30bf\u30fc\u306f\u7701\u7565\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-61\">\u30ab\u30b9\u30bf\u30e0\u985e\u4f3c\u5ea6\u8a08\u7b97\u306e\u5b9f\u88c5<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class CustomSimilarityCalculator extends ClassicSimilarity {\n    @Override\n    public float tf(float freq) {\n        \/\/ \u30ab\u30b9\u30bf\u30e0\u983b\u5ea6\u91cd\u307f\u4ed8\u3051\n        return (float) (1 + Math.log(freq));\n    }\n\n    @Override\n    public float idf(long docFreq, long docCount) {\n        \/\/ \u30ab\u30b9\u30bf\u30e0IDF\u8a08\u7b97\n        return (float) (Math.log(docCount \/ (double)(docFreq + 1)) + 1.0);\n    }\n\n    @Override\n    public float lengthNorm(int length) {\n        \/\/ \u30ab\u30b9\u30bf\u30e0\u9577\u3055\u306e\u6b63\u898f\u5316\n        return (float) (1.0 \/ Math.sqrt(length));\n    }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-62\">\u5730\u7406\u7a7a\u9593\u691c\u7d22\u306e\u5c0e\u5165\u65b9\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-63\">\u4f4d\u7f6e\u60c5\u5831\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u5b9f\u88c5<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class GeoSearchManager {\n    private final IndexWriter writer;\n\n    public void indexLocation(String id, String name, \n                            double lat, double lon) throws IOException {\n        Document doc = new Document();\n\n        \/\/ \u4f4d\u7f6e\u60c5\u5831\u306e\u4fdd\u5b58\n        doc.add(new StringField(\"id\", id, Field.Store.YES));\n        doc.add(new StoredField(\"name\", name));\n        doc.add(new LatLonPoint(\"location\", lat, lon));\n        doc.add(new LatLonDocValuesField(\"location\", lat, lon));\n\n        \/\/ \u5143\u306e\u7def\u5ea6\u7d4c\u5ea6\u3082\u4fdd\u5b58\n        doc.add(new StoredField(\"lat\", lat));\n        doc.add(new StoredField(\"lon\", lon));\n\n        writer.addDocument(doc);\n    }\n\n    public List&lt;NearbyLocation&gt; findNearbyLocations(double lat, double lon, \n                                                   double radiusKm) \n            throws IOException {\n        \/\/ \u8ddd\u96e2\u691c\u7d22\u30af\u30a8\u30ea\u306e\u4f5c\u6210\n        Query query = LatLonPoint.newDistanceQuery(\"location\", lat, lon, \n                                                 radiusKm * 1000);\n\n        \/\/ \u8ddd\u96e2\u3067\u30bd\u30fc\u30c8\n        SortField distSortField = LatLonDocValuesField.newDistanceSort(\n            \"location\", lat, lon);\n        Sort sort = new Sort(distSortField);\n\n        \/\/ \u691c\u7d22\u5b9f\u884c\n        TopDocs topDocs = searcher.search(query, 10, sort);\n\n        return Arrays.stream(topDocs.scoreDocs)\n            .map(scoreDoc -&gt; {\n                try {\n                    Document doc = searcher.doc(scoreDoc.doc);\n                    FieldDoc fieldDoc = (FieldDoc) scoreDoc;\n                    double distance = ((Double) fieldDoc.fields[0]) \/ 1000.0;\n\n                    return new NearbyLocation(\n                        doc.get(\"id\"),\n                        doc.get(\"name\"),\n                        doc.getField(\"lat\").numericValue().doubleValue(),\n                        doc.getField(\"lon\").numericValue().doubleValue(),\n                        distance\n                    );\n                } catch (IOException e) {\n                    throw new RuntimeException(e);\n                }\n            })\n            .collect(Collectors.toList());\n    }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-64\">\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u691c\u7d22\u306e\u5b9f\u73fe\u65b9\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-65\">Near Real-time Search \u306e\u5b9f\u88c5<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class RealTimeSearchManager {\n    private final IndexWriter writer;\n    private final SearcherManager searcherManager;\n    private final ControlledRealTimeReopenThread&lt;IndexSearcher&gt; reopenThread;\n\n    public RealTimeSearchManager(Directory directory) throws IOException {\n        IndexWriterConfig config = new IndexWriterConfig(new JapaneseAnalyzer());\n        config.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);\n\n        this.writer = new IndexWriter(directory, config);\n        this.searcherManager = new SearcherManager(writer, true, true, null);\n\n        \/\/ \u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u66f4\u65b0\u30b9\u30ec\u30c3\u30c9\u306e\u8a2d\u5b9a\n        this.reopenThread = new ControlledRealTimeReopenThread&lt;&gt;(\n            writer, searcherManager, \n            5.0, \/\/ \u6700\u5927\u5f85\u6a5f\u6642\u9593\uff08\u79d2\uff09\n            0.1  \/\/ \u6700\u5c0f\u5f85\u6a5f\u6642\u9593\uff08\u79d2\uff09\n        );\n\n        reopenThread.start();\n    }\n\n    public void addDocument(Document doc) throws IOException {\n        \/\/ \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u8ffd\u52a0\n        writer.addDocument(doc);\n\n        \/\/ \u975e\u540c\u671f\u30b3\u30df\u30c3\u30c8\n        writer.commit();\n    }\n\n    public List&lt;Document&gt; search(Query query) throws IOException {\n        IndexSearcher searcher = null;\n        try {\n            \/\/ \u6700\u65b0\u306eSearcher\u3092\u53d6\u5f97\n            searcher = searcherManager.acquire();\n\n            \/\/ \u691c\u7d22\u5b9f\u884c\n            TopDocs topDocs = searcher.search(query, 10);\n\n            return Arrays.stream(topDocs.scoreDocs)\n                .map(scoreDoc -&gt; {\n                    try {\n                        return searcher.doc(scoreDoc.doc);\n                    } catch (IOException e) {\n                        throw new RuntimeException(e);\n                    }\n                })\n                .collect(Collectors.toList());\n        } finally {\n            \/\/ Searcher\u306e\u30ea\u30ea\u30fc\u30b9\n            if (searcher != null) {\n                searcherManager.release(searcher);\n            }\n        }\n    }\n\n    public void refreshSearcher() throws IOException {\n        searcherManager.maybeRefresh();\n    }\n\n    public void close() throws IOException {\n        reopenThread.close();\n        searcherManager.close();\n        writer.close();\n    }\n}\n\n\/\/ \u4f7f\u7528\u4f8b\npublic class RealTimeSearchExample {\n    public static void main(String[] args) throws IOException {\n        RealTimeSearchManager manager = new RealTimeSearchManager(\n            FSDirectory.open(Paths.get(\"\/path\/to\/index\"))\n        );\n\n        \/\/ \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u8ffd\u52a0\n        Document doc = new Document();\n        doc.add(new TextField(\"title\", \"\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u691c\u7d22\", Field.Store.YES));\n        manager.addDocument(doc);\n\n        \/\/ \u691c\u7d22\u5b9f\u884c\n        QueryParser parser = new QueryParser(\"title\", new JapaneseAnalyzer());\n        Query query = parser.parse(\"\u691c\u7d22\");\n        List&lt;Document&gt; results = manager.search(query);\n\n        \/\/ \u7d50\u679c\u8868\u793a\n        results.forEach(result -&gt; \n            System.out.println(result.get(\"title\"))\n        );\n    }\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u767a\u5c55\u7684\u306a\u4f7f\u3044\u65b9\u306f\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u7279\u5fb4\u3068\u5229\u70b9\u304c\u3042\u308a\u307e\u3059\uff1a<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt\">\u7279\u5fb4\u3068\u5229\u70b9<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u985e\u4f3c\u6587\u66f8\u691c\u7d22<\/strong>\n<ul class=\"wp-block-list\">\n<li>MoreLikeThis\u306b\u3088\u308b\u9ad8\u7cbe\u5ea6\u306a\u985e\u4f3c\u5ea6\u8a08\u7b97<\/li>\n\n\n\n<li>\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u53ef\u80fd\u306a\u985e\u4f3c\u5ea6\u30b9\u30b3\u30a2\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>\u67d4\u8edf\u306a\u985e\u4f3c\u5ea6\u30d1\u30e9\u30e1\u30fc\u30bf\u8abf\u6574<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u5730\u7406\u7a7a\u9593\u691c\u7d22<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u52b9\u7387\u7684\u306a\u4f4d\u7f6e\u60c5\u5831\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316<\/li>\n\n\n\n<li>\u8ddd\u96e2\u306b\u57fa\u3065\u304f\u691c\u7d22\u3068\u4e26\u3073\u66ff\u3048<\/li>\n\n\n\n<li>\u8907\u6570\u306e\u4f4d\u7f6e\u60c5\u5831\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u306e\u30b5\u30dd\u30fc\u30c8<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u691c\u7d22<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u975e\u540c\u671f\u66f4\u65b0\u306b\u3088\u308b\u9ad8\u901f\u306a\u691c\u7d22<\/li>\n\n\n\n<li>\u52b9\u7387\u7684\u306a\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u66f4\u65b0<\/li>\n\n\n\n<li>\u30ea\u30bd\u30fc\u30b9\u7ba1\u7406\u306e\u6700\u9069\u5316<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u6a5f\u80fd\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u9ad8\u5ea6\u306a\u691c\u7d22\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u69cb\u7bc9\u3067\u304d\u307e\u3059\u3002\u4f8b\u3048\u3070\uff1a<\/p>\n\n\n\n<div class=\"wp-block-sgb-block-simple sgb-box-simple sgb-box-simple--title-normal sgb-box-simple--with-border\"><div style=\"background-color:var(--wp--preset--color--sango-main);color:#FFF\" class=\"sgb-box-simple__title\">\u4f8b<\/div><div class=\"sgb-box-simple__body\" style=\"border-color:var(--wp--preset--color--sango-main);background-color:#FFF\">\n<ul class=\"wp-block-list\">\n<li>\u30b3\u30f3\u30c6\u30f3\u30c4\u30ec\u30b3\u30e1\u30f3\u30c7\u30fc\u30b7\u30e7\u30f3\u30b7\u30b9\u30c6\u30e0<\/li>\n\n\n\n<li>\u4f4d\u7f6e\u60c5\u5831\u30d9\u30fc\u30b9\u306e\u30b5\u30fc\u30d3\u30b9\u691c\u7d22<\/li>\n\n\n\n<li>\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u30b7\u30b9\u30c6\u30e0<\/li>\n<\/ul>\n<\/div><\/div>\n\n\n\n<p>\u306a\u3069\u306e\u5b9f\u88c5\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"i-66\">\u307e\u3068\u3081\uff1aApache Lucene\u3067\u5b9f\u73fe\u3059\u308b\u6b21\u4e16\u4ee3\u306e\u691c\u7d22\u30b7\u30b9\u30c6\u30e0<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-67\">\u5b9f\u88c5\u306e\u30ad\u30fc\u30dd\u30a4\u30f3\u30c8<\/h2>\n\n\n\n<p>\u672c\u8a18\u4e8b\u3067\u89e3\u8aac\u3057\u305f Apache Lucene \u306e\u5b9f\u88c5\u306b\u304a\u3051\u308b\u30ad\u30fc\u30dd\u30a4\u30f3\u30c8\u3092\u4ee5\u4e0b\u306b\u307e\u3068\u3081\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u76e4\u8a2d\u8a08\u306e\u91cd\u8981\u6027<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u9069\u5207\u306a\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u8a2d\u8a08<\/li>\n\n\n\n<li>\u52b9\u7387\u7684\u306a\u30d5\u30a3\u30fc\u30eb\u30c9\u69cb\u6210<\/li>\n\n\n\n<li>\u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3\u3092\u8003\u616e\u3057\u305f\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u57fa\u672c\u539f\u5247<\/strong><\/li>\n<\/ol>\n\n\n<div id=\"id-5f1d78de-bc09-4a7a-8df6-cceeedf447a9\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u89b3\u70b9<\/th><th>\u91cd\u8981\u30dd\u30a4\u30f3\u30c8<\/th><th>\u5b9f\u88c5\u306e\u30b3\u30c4<\/th><\/tr><\/thead><tbody><tr><td>\u30e1\u30e2\u30ea\u7ba1\u7406<\/td><td>\u9069\u5207\u306a\u30d0\u30c3\u30d5\u30a1\u30b5\u30a4\u30ba\u8a2d\u5b9a<\/td><td>RAMBufferSize\u306e\u6700\u9069\u5316<\/td><\/tr><tr><td>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9<\/td><td>\u30bb\u30b0\u30e1\u30f3\u30c8\u7ba1\u7406\u306e\u6700\u9069\u5316<\/td><td>\u5b9a\u671f\u7684\u306a\u30de\u30fc\u30b8\u30dd\u30ea\u30b7\u30fc\u898b\u76f4\u3057<\/td><\/tr><tr><td>\u691c\u7d22\u901f\u5ea6<\/td><td>\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565\u306e\u6d3b\u7528<\/td><td>\u30d5\u30a3\u30fc\u30eb\u30c9\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u9069\u5207\u306a\u5229\u7528<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u904b\u7528\u9762\u3067\u306e\u6ce8\u610f\u70b9<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u5b9a\u671f\u7684\u306a\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u306e\u5b9f\u65bd<\/li>\n\n\n\n<li>\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u6226\u7565\u306e\u78ba\u7acb<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u52a3\u5316\u306e\u4e88\u9632\u63aa\u7f6e<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-68\">\u958b\u767a\u30ed\u30fc\u30c9\u30de\u30c3\u30d7\u306e\u63d0\u6848<\/h2>\n\n\n\n<p>\u4eca\u5f8c Lucene \u3092\u6d3b\u7528\u3057\u305f\u30b7\u30b9\u30c6\u30e0\u958b\u767a\u3092\u9032\u3081\u308b\u969b\u306e\u6bb5\u968e\u7684\u306a\u30a2\u30d7\u30ed\u30fc\u30c1\u3092\u63d0\u6848\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u5b9f\u88c5\u30d5\u30a7\u30fc\u30ba<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   \/\/ \u6700\u521d\u306b\u5b9f\u88c5\u3059\u3079\u304d\u57fa\u672c\u6a5f\u80fd\n   public class BasicSearchSystem {\n       private final IndexWriter writer;\n       private final SearcherManager searcherManager;\n\n       \/\/ \u57fa\u672c\u7684\u306a\u691c\u7d22\u6a5f\u80fd\u306e\u5b9f\u88c5\n       public List&lt;Document&gt; search(String keyword) {\n           \/\/ \u57fa\u672c\u7684\u306a\u691c\u7d22\u30ed\u30b8\u30c3\u30af\n       }\n   }<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u6700\u9069\u5316\u30d5\u30a7\u30fc\u30ba<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   \/\/ \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u5c0e\u5165\n   public class OptimizedSearchSystem extends BasicSearchSystem {\n       private final QueryCache queryCache;\n       private final PerformanceMonitor monitor;\n\n       \/\/ \u6700\u9069\u5316\u6a5f\u80fd\u306e\u8ffd\u52a0\n       @Override\n       public List&lt;Document&gt; search(String keyword) {\n           \/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u3068\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u3092\u542b\u3080\u691c\u7d22\u30ed\u30b8\u30c3\u30af\n       }\n   }<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u6a5f\u80fd\u62e1\u5f35\u30d5\u30a7\u30fc\u30ba<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   \/\/ \u9ad8\u5ea6\u306a\u6a5f\u80fd\u306e\u8ffd\u52a0\n   public class AdvancedSearchSystem extends OptimizedSearchSystem {\n       private final SimilarDocumentFinder similarityFinder;\n       private final GeoSearchManager geoSearch;\n\n       \/\/ \u62e1\u5f35\u6a5f\u80fd\u306e\u5b9f\u88c5\n       public List&lt;Document&gt; findSimilar(int docId) {\n           \/\/ \u985e\u4f3c\u6587\u66f8\u691c\u7d22\u30ed\u30b8\u30c3\u30af\n       }\n   }<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-69\">\u4eca\u5f8c\u306e\u767a\u5c55\u65b9\u5411\u6027<\/h2>\n\n\n\n<p>Lucene \u3092\u6d3b\u7528\u3057\u305f\u30b7\u30b9\u30c6\u30e0\u306e\u5c06\u6765\u7684\u306a\u767a\u5c55\u65b9\u5411\u3068\u3057\u3066\u3001\u4ee5\u4e0b\u306e\u9818\u57df\u306b\u6ce8\u76ee\u3059\u308b\u3053\u3068\u3092\u304a\u52e7\u3081\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>AI\/ML \u3068\u306e\u7d71\u5408<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u691c\u7d22\u30e9\u30f3\u30ad\u30f3\u30b0\u306e\u6a5f\u68b0\u5b66\u7fd2\u6700\u9069\u5316<\/li>\n\n\n\n<li>\u30e6\u30fc\u30b6\u30fc\u884c\u52d5\u5206\u6790\u3068\u306e\u9023\u643a<\/li>\n\n\n\n<li>\u30ec\u30b3\u30e1\u30f3\u30c7\u30fc\u30b7\u30e7\u30f3\u6a5f\u80fd\u306e\u5f37\u5316<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u5206\u6563\u30b7\u30b9\u30c6\u30e0\u3078\u306e\u5c55\u958b<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u30b7\u30e3\u30fc\u30c7\u30a3\u30f3\u30b0\u306e\u5c0e\u5165<\/li>\n\n\n\n<li>\u30ec\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30af\u30e9\u30b9\u30bf\u7ba1\u7406\u306e\u81ea\u52d5\u5316<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u65b0\u3057\u3044\u691c\u7d22\u30d1\u30e9\u30c0\u30a4\u30e0<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u81ea\u7136\u8a00\u8a9e\u691c\u7d22\u306e\u5f37\u5316<\/li>\n\n\n\n<li>\u30de\u30eb\u30c1\u30e2\u30fc\u30c0\u30eb\u691c\u7d22\u3078\u306e\u5bfe\u5fdc<\/li>\n\n\n\n<li>\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u691c\u7d22\u306e\u9ad8\u5ea6\u5316<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-70\">\u6700\u7d42\u30a2\u30c9\u30d0\u30a4\u30b9<\/h2>\n\n\n\n<p>Lucene \u3092\u4f7f\u7528\u3057\u305f\u30b7\u30b9\u30c6\u30e0\u958b\u767a\u3092\u6210\u529f\u3055\u305b\u308b\u305f\u3081\u306e\u30dd\u30a4\u30f3\u30c8\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u6bb5\u968e\u7684\u306a\u5b9f\u88c5<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u57fa\u672c\u6a5f\u80fd\u304b\u3089\u7740\u624b<\/li>\n\n\n\n<li>\u9806\u6b21\u6700\u9069\u5316\u3092\u5c0e\u5165<\/li>\n\n\n\n<li>\u6a5f\u80fd\u3092\u6bb5\u968e\u7684\u306b\u62e1\u5f35<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u7d99\u7d9a\u7684\u306a\u6539\u5584<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>\u30e6\u30fc\u30b6\u30fc\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u306e\u53ce\u96c6<\/li>\n\n\n\n<li>\u5b9a\u671f\u7684\u306a\u6280\u8853\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u54c1\u8cea\u306e\u7dad\u6301<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u5305\u62ec\u7684\u306a\u30c6\u30b9\u30c8\u306e\u5b9f\u65bd<\/li>\n\n\n\n<li>\u5b9a\u671f\u7684\u306a\u30b3\u30fc\u30c9\u898b\u76f4\u3057<\/li>\n\n\n\n<li>\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u7dad\u6301\u7ba1\u7406<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>Apache Lucene \u306f\u3001\u9069\u5207\u306b\u5b9f\u88c5\u30fb\u904b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u9ad8\u6027\u80fd\u3067\u4fe1\u983c\u6027\u306e\u9ad8\u3044\u691c\u7d22\u30b7\u30b9\u30c6\u30e0\u3092\u5b9f\u73fe\u3067\u304d\u308b\u5f37\u529b\u306a\u30e9\u30a4\u30d6\u30e9\u30ea\u3067\u3059\u3002\u672c\u8a18\u4e8b\u3067\u89e3\u8aac\u3057\u305f\u5b9f\u88c5\u30c6\u30af\u30cb\u30c3\u30af\u3068\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u6d3b\u7528\u3057\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u8981\u4ef6\u306b\u5408\u308f\u305b\u305f\u6700\u9069\u306a\u691c\u7d22\u30b7\u30b9\u30c6\u30e0\u3092\u69cb\u7bc9\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Apache Lucene\u3068\u306f\uff1a\u6a5f\u80fd\u3068\u7279\u5fb4\u3092\u5fb9\u5e95\u89e3\u8aac Warning: Undefined array key &#8220;is_admin&#8221; in \/home\/xs392991\/dexall.co.jp\/public_html\/ &#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-679","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-uncategorized","7":"nothumb"},"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/679","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=679"}],"version-history":[{"count":1,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/679\/revisions"}],"predecessor-version":[{"id":691,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/679\/revisions\/691"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=679"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=679"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=679"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}