<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>LookPHP</title>
  <icon>https://www.gravatar.com/avatar/4e728b1b244070a1005da09d25d0faf3</icon>
  
  <link href="/atom.xml" rel="self"/>
  
  <link href="https://lookphp.github.io/"/>
  <updated>2018-12-11T16:03:56.201Z</updated>
  <id>https://lookphp.github.io/</id>
  
  <author>
    <name>lookphp</name>
    <email>lookphp@163.com</email>
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>如何将 Github 上的仓库导入 CODING</title>
    <link href="https://lookphp.github.io/2018/12/11/%E5%A6%82%E4%BD%95%E5%B0%86-Github-%E4%B8%8A%E7%9A%84%E4%BB%93%E5%BA%93%E5%AF%BC%E5%85%A5-CODING/"/>
    <id>https://lookphp.github.io/2018/12/11/如何将-Github-上的仓库导入-CODING/</id>
    <published>2018-12-11T15:24:00.000Z</published>
    <updated>2018-12-11T16:03:56.201Z</updated>
    
    <content type="html"><![CDATA[<h1 id="在-CODING-中新建项目"><a href="#在-CODING-中新建项目" class="headerlink" title="在 CODING 中新建项目"></a>在 CODING 中新建项目</h1><p>在 CODING 中新建一个同名项目，不选择 启用 README.md 文件初始化项目，以及任何 License 和 .gitignore 文件。<br><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-2775efb96eac33eb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure></p><h1 id="克隆-Github-上的项目"><a href="#克隆-Github-上的项目" class="headerlink" title="克隆 Github 上的项目"></a>克隆 Github 上的项目</h1><p>将 Github 上想要导入的项目完整克隆到本地。<br><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-29db5050f1fbade1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure></p><p>本地执行克隆命令，并带上参数 <code>--bare</code><br><code>git clone https://github.com/antirez/redis.git --bare</code><br><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-23f9ec258292b944.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure></p><h1 id="将克隆下来的仓库推送到-CODING"><a href="#将克隆下来的仓库推送到-CODING" class="headerlink" title="将克隆下来的仓库推送到 CODING"></a>将克隆下来的仓库推送到 CODING</h1><p>克隆完成后，将仓库推送到 CODING 上。<br>使用仓库页面提供的 URL。<br><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-88df801b8ce464bd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure></p><p>推送所有的分支和对象，向coding推送时，需要添加参数 <code>--all</code><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">cd redis.git</span><br><span class="line"></span><br><span class="line">git push https://git.coding.net/jiong/redis.git --all</span><br></pre></td></tr></table></figure></p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-0798c1ce42580323.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><p>完成后，再执行推送所有的标签的命令，带参数 <code>--tag</code>。<br><code>git push https://git.coding.net/jiong/redis.git --tags</code></p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-0e93b05fc67b503d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-effbbd70e7176326.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><p>这样，整个仓库就全部导入到 CODING 中了。</p><h1 id="参考文档"><a href="#参考文档" class="headerlink" title="参考文档"></a>参考文档</h1><ul><li><a href="https://coding.net/help/doc/git/import.html" target="_blank" rel="noopener">如何将 git 仓库导入 CODING？</a></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;在-CODING-中新建项目&quot;&gt;&lt;a href=&quot;#在-CODING-中新建项目&quot; class=&quot;headerlink&quot; title=&quot;在 CODING 中新建项目&quot;&gt;&lt;/a&gt;在 CODING 中新建项目&lt;/h1&gt;&lt;p&gt;在 CODING 中新建一个同名项目，不选择
      
    
    </summary>
    
    
      <category term="git" scheme="https://lookphp.github.io/tags/git/"/>
    
  </entry>
  
  <entry>
    <title>在 Oracle 中实现自增ID</title>
    <link href="https://lookphp.github.io/2018/12/06/%E5%9C%A8-Oracle-%E4%B8%AD%E5%AE%9E%E7%8E%B0%E8%87%AA%E5%A2%9EID/"/>
    <id>https://lookphp.github.io/2018/12/06/在-Oracle-中实现自增ID/</id>
    <published>2018-12-06T15:39:11.000Z</published>
    <updated>2018-12-11T15:52:06.192Z</updated>
    
    <content type="html"><![CDATA[<p>如果你经常使用 MySQL，你肯定对 AUTO_INCREMENT 非常熟悉，因为经常要用到它。</p><h1 id="一、什么是自增列？"><a href="#一、什么是自增列？" class="headerlink" title="一、什么是自增列？"></a>一、什么是自增列？</h1><p>自增列是数据库中值随插入的每个行自动增加的一列。它最常用于主键或 ID 字段，这样每次增加一行时，不用指该字段的值，它就会自动增加，而且是唯一的。</p><p>当在 MySQL 中定义列时，我们可以指定一个名为 AUTO_INCREMENT 的参数。然后，每当将新值插入此表中时，放入此列的值比最后一个值加 1。</p><p>但很不幸，Oracle 没有 AUTO_INCREMENT 功能。 那要如何在Oracle中做到这一点呢？</p><h1 id="二、在-Oracle-11g-中设置自增字段"><a href="#二、在-Oracle-11g-中设置自增字段" class="headerlink" title="二、在 Oracle 11g 中设置自增字段"></a>二、在 Oracle 11g 中设置自增字段</h1><h2 id="创建表"><a href="#创建表" class="headerlink" title="创建表"></a>创建表</h2><p>首先创建一张用于测试的表：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">CREATE TABLE &quot;TEST&quot; (</span><br><span class="line">ID NUMBER(11) PRIMARY KEY,</span><br><span class="line">NAME VARCHAR2(50BYTE) NOT NULL</span><br><span class="line">);</span><br></pre></td></tr></table></figure></p><h2 id="创建序列"><a href="#创建序列" class="headerlink" title="创建序列"></a>创建序列</h2><p>然后创建一个名为 TEST_ID_SEQ 的序列（序列名称自己随意设定）：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">CREATE SEQUENCE TEST_ID_SEQ</span><br><span class="line">INCREMENT BY 1</span><br><span class="line">START WITH 100</span><br><span class="line">MAXVALUE 999999999</span><br><span class="line">NOCYCLE</span><br><span class="line">NOCACHE;</span><br></pre></td></tr></table></figure></p><p>如果要删除序列，可以使用下面的 SQL 命令：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">DROP SEQUENCE TEST_ID_SEQ;</span><br></pre></td></tr></table></figure><p>对 SEQUENCE 的一些说明：</p><ul><li>INCREMENT BY 用于指定序列增量（默认值：1），如果指定的是正整数，则序列号自动递增，如果指定的是负数，则自动递减。</li><li>START WITH 用于指定序列生成器生成的第一个序列号，当序列号顺序递增时默认值为序列号的最小值，当序列号顺序递减时默认值为序列号的最大值。</li><li>MAXVALUE 用于指定序列生成器可以生成的组大序列号（必须大于或等于 START WITH，并且必须大于 MINVALUE），默认为 NOMAXVALUE。</li><li>MINVALUE 用于指定序列生成器可以生成的最小序列号（必须小于或等于 START WITH，并且必须小于 MAXVALUE），默认值为 NOMINVALUE。</li><li>CYCLE 用于指定在达到序列的最大值或最小值之后是否继续生成序列号，默认为 NOCYCLE。</li><li>CACHE 用于指定在内存中可以预分配的序列号个数（默认值：20）。</li></ul><p>到这一步其实就已经可以实现字段自增，只要插入的时候，将 ID 的值设置为序列的下一个值 TEST_ID_SEQ.NEXTVAL 就可以了：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">SQL&gt; INSERT INTO &quot;TEST&quot; (&quot;ID&quot;, &quot;NAME&quot;) VALUES (TEST_ID_SEQ.NEXTVAL, &apos;name1&apos;);</span><br><span class="line">SQL&gt; INSERT INTO &quot;TEST&quot; (&quot;ID&quot;, &quot;NAME&quot;) VALUES (TEST_ID_SEQ.NEXTVAL, &apos;name2&apos;);</span><br><span class="line">SQL&gt; INSERT INTO &quot;TEST&quot; (&quot;ID&quot;, &quot;NAME&quot;) VALUES (TEST_ID_SEQ.NEXTVAL, &apos;name3&apos;);</span><br><span class="line">SQL&gt; SELECT * FROM &quot;TEST&quot;;</span><br><span class="line"></span><br><span class="line">ID   NAME</span><br><span class="line">---  ------</span><br><span class="line">100    name1</span><br><span class="line">101    name2</span><br><span class="line">102    name3</span><br></pre></td></tr></table></figure></p><p>为了简化插入操作，我们还可以创建一个触发器，当将数据插入到 “TEST” 表的时候，自动将最新的 ID 插入进去。</p><h2 id="创建触发器"><a href="#创建触发器" class="headerlink" title="创建触发器"></a>创建触发器</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">CREATE OR REPLACE TRIGGER TEST_ID_SEQ_TRG</span><br><span class="line">BEFORE INSERT ON &quot;TEST&quot;</span><br><span class="line">FOR EACH ROW</span><br><span class="line">WHEN (NEW.&quot;ID&quot; IS NULL)</span><br><span class="line">BEGIN</span><br><span class="line">SELECT TEST_ID_SEQ.NEXTVAL</span><br><span class="line">INTO :NEW.&quot;ID&quot;</span><br><span class="line">FROM DUAL;</span><br><span class="line">END;</span><br></pre></td></tr></table></figure><p>这样的话，每次写插入语句，只需要将 ID 字段的值设置为 NULL 它就会自动递增了：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">SQL&gt; INSERT INTO &quot;TEST&quot; (&quot;ID&quot;, &quot;NAME&quot;) VALUES (NULL, &apos;name4&apos;);</span><br><span class="line">SQL&gt; INSERT INTO &quot;TEST&quot; (&quot;ID&quot;, &quot;NAME&quot;) VALUES (NULL, &apos;name5&apos;);</span><br><span class="line">SQL&gt; INSERT INTO &quot;TEST&quot; (&quot;ID&quot;, &quot;NAME&quot;) VALUES (NULL, &apos;name6&apos;);</span><br><span class="line">SQL&gt; SELECT * FROM &quot;TEST&quot;;</span><br><span class="line"></span><br><span class="line">ID   NAME</span><br><span class="line">---  ------</span><br><span class="line">100    name1</span><br><span class="line">101    name2</span><br><span class="line">102    name3</span><br><span class="line">103    name4</span><br><span class="line">104    name5</span><br><span class="line">105    name6</span><br></pre></td></tr></table></figure></p><h2 id="一些值得注意的地方"><a href="#一些值得注意的地方" class="headerlink" title="一些值得注意的地方"></a>一些值得注意的地方</h2><h3 id="插入指定-ID"><a href="#插入指定-ID" class="headerlink" title="插入指定 ID"></a>插入指定 ID</h3><p>如果某条插入语句指定了 ID 的值如：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">SQL&gt; INSERT INTO &quot;TEST&quot; (&quot;ID&quot;, &quot;NAME&quot;) VALUES (1000, &apos;name1001&apos;);</span><br><span class="line">SQL&gt; SELECT * FROM &quot;TEST&quot;;</span><br><span class="line"></span><br><span class="line">ID   NAME</span><br><span class="line">---  ------</span><br><span class="line">100    name1</span><br><span class="line">101    name2</span><br><span class="line">102    name3</span><br><span class="line">103    name4</span><br><span class="line">104    name5</span><br><span class="line">1000    name1001</span><br></pre></td></tr></table></figure></p><p>那么下次 ID 还是会在原来的基础上继续增加：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">SQL&gt; INSERT INTO &quot;TEST&quot; (&quot;ID&quot;, &quot;NAME&quot;) VALUES (NULL, &apos;name1001&apos;);</span><br><span class="line">SQL&gt; SELECT * FROM &quot;TEST&quot;;</span><br><span class="line"></span><br><span class="line">ID   NAME</span><br><span class="line">---  ------</span><br><span class="line">100    name1</span><br><span class="line">101    name2</span><br><span class="line">102    name3</span><br><span class="line">103    name4</span><br><span class="line">104    name5</span><br><span class="line">1000    name1001</span><br></pre></td></tr></table></figure></p><p>但当序列的值到了 1000 的时候，如果 ID 允许重复，就会有两行记录 ID 都为 1000。</p><p>但如果 ID 设置为了主键，如本文的例子 ID NUMBER(11) PRIMARY KEY，则插入就会报错：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Error : ORA-00001: unique constraint (SOFTWARE.SYS_C0014995) violated</span><br></pre></td></tr></table></figure></p><h3 id="字段加引号"><a href="#字段加引号" class="headerlink" title="字段加引号"></a>字段加引号</h3><p>在 SQL 语句中，字段最好都加上引号，不然可能会报错：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Error : ORA-00900: invalid SQL statement</span><br></pre></td></tr></table></figure></p><p>或：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ORA-24344: Success with Compilation Error</span><br></pre></td></tr></table></figure></p><h3 id="SQUENCE"><a href="#SQUENCE" class="headerlink" title="SQUENCE"></a>SQUENCE</h3><ul><li>第一次 NEXTVAL 返回的是初始值；随后的 NEXTVAL 会自动增加 INCREMENT BY 对应的值，然后返回增加后的值。</li><li>CURRVAL 总是返回当前 SEQUENCE 的值，但是在第一次 NEXTVAL 初始化之后才能使用 CURRVAL ，否则会出错。</li><li>一次 NEXTVAL 会增加一次 SEQUENCE 的值，所以如果在同一个语句里面使用多个NEXTVAL，其值就是不一样的。</li><li>如果指定 CACHE 值，Oracle 就可以预先在内存里面放置一些 SEQUENCE，这样存取的快些。 CACHE 里面的取完后，Oracle 自动再取一组到 CACHE。</li><li>但使用 CACHE 或许会跳号，比如数据库突然不正常关闭（shutdown abort)， CACHE 中的 SEQUENCE 就会丢失。所以可以在 CREATE SEQUENCE 的时候用 NOCACHE 防止这种情况。</li></ul><h3 id="性能"><a href="#性能" class="headerlink" title="性能"></a>性能</h3><p>在数据库操作中，触发器的使用耗费系统资源相对较大。如果对于表容量相对较小的表格我们可以忽略触发器带来的性能影响。</p><p>考虑到大表操作的性能问题，需要尽可能的减少触发器的使用。对于以上操作，就可以抛弃触发器的使用，直接手动调用序列函数即可，但这样可能在程序维护上稍微带来一些不便。</p><h1 id="三、实现自增ID-实现步骤顺序总结"><a href="#三、实现自增ID-实现步骤顺序总结" class="headerlink" title="三、实现自增ID,实现步骤顺序总结"></a>三、实现自增ID,实现步骤顺序总结</h1><ol><li>创建ID为主键的表（PRIMARY KEY）</li><li>创建序列</li><li>创建触发器</li><li>每个表都需要按顺序123建一次，工程量浩大</li></ol><h1 id="四、在-Oracle-12c-中设置自增字段"><a href="#四、在-Oracle-12c-中设置自增字段" class="headerlink" title="四、在 Oracle 12c 中设置自增字段"></a>四、在 Oracle 12c 中设置自增字段</h1><p>在 Oracle 12c 中设置自增字段就简单多了，因为 ORacle 12c 提供了 IDENTITY 属性：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">CREATE TABLE &quot;TEST&quot; (</span><br><span class="line">ID NUMBER(11) GENERATED BY DEFAULT ON NULL AS IDENTITY,</span><br><span class="line">NAME VARCHAR2(50BYTE) NOT NULL</span><br><span class="line">);</span><br></pre></td></tr></table></figure></p><p>这样就搞定了！和 MySQL 一样简单！🤣🤣🤣</p><h1 id="五、总结"><a href="#五、总结" class="headerlink" title="五、总结"></a>五、总结</h1><p>所以如上所属，在 Oracle 中设置自增字段，需要根据不同的版本使用不同的方法：</p><p>在 Oracle 11g 中，需要先创建序列（SQUENCE）再创建一个触发器（TRIGGER）。<br>在 Oracle 12c 中，只需要使用 IDENTITY 属性就可以了。</p><h1 id="参考文档"><a href="#参考文档" class="headerlink" title="参考文档"></a>参考文档</h1><p><a href="https://blog.csdn.net/zxh2075/article/details/78488141" target="_blank" rel="noopener">oracle 实现 自增主键功能</a></p><p><a href="https://github.com/nodejh/nodejh.github.io/issues/33" target="_blank" rel="noopener">在 Oracle 中设置自增列</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;如果你经常使用 MySQL，你肯定对 AUTO_INCREMENT 非常熟悉，因为经常要用到它。&lt;/p&gt;
&lt;h1 id=&quot;一、什么是自增列？&quot;&gt;&lt;a href=&quot;#一、什么是自增列？&quot; class=&quot;headerlink&quot; title=&quot;一、什么是自增列？&quot;&gt;&lt;/a&gt;一、什
      
    
    </summary>
    
    
      <category term="Oracle" scheme="https://lookphp.github.io/tags/Oracle/"/>
    
  </entry>
  
  <entry>
    <title>Oracle 实现与mysql中find_in_set函数的兼容</title>
    <link href="https://lookphp.github.io/2018/12/06/Oracle-%E5%AE%9E%E7%8E%B0%E4%B8%8Emysql%E4%B8%ADfind-in-set%E5%87%BD%E6%95%B0%E7%9A%84%E5%85%BC%E5%AE%B9/"/>
    <id>https://lookphp.github.io/2018/12/06/Oracle-实现与mysql中find-in-set函数的兼容/</id>
    <published>2018-12-06T15:38:49.000Z</published>
    <updated>2018-12-06T15:41:57.093Z</updated>
    
    <content type="html"><![CDATA[<p>find_in_set(str,strList)，寻找str在strList中的位置。</p><p>sql代码：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">-- 返回结果为1,</span><br><span class="line">SELECT FIND_IN_SET(&apos;1&apos;,&apos;1,2,3&apos;) FROM DUAL;</span><br></pre></td></tr></table></figure></p><p>sql代码：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">-- 返回结果为2</span><br><span class="line">SELECT FIND_IN_SET(&apos;1&apos;,&apos;2,1,3&apos;) FROM DUAL;</span><br></pre></td></tr></table></figure></p><p>具体创建函数如下：</p><p>sql代码：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line">create or replace FUNCTION FIND_IN_SET(piv_str1 varchar2, piv_str2 varchar2, p_sep varchar2 := &apos;,&apos;)</span><br><span class="line">RETURN NUMBER IS</span><br><span class="line">l_idx    number:=0; -- 用于计算piv_str2中分隔符的位置</span><br><span class="line">str      varchar2(500);  -- 根据分隔符截取的子字符串</span><br><span class="line">piv_str  varchar2(500) := piv_str2; -- 将piv_str2赋值给piv_str</span><br><span class="line">res      number:=0; -- 返回结果</span><br><span class="line">res_place      number:=0;-- 原字符串在目标字符串中的位置</span><br><span class="line">BEGIN</span><br><span class="line">-- 如果字段是null 则返回0</span><br><span class="line">IF piv_str2 IS NULL THEN</span><br><span class="line">RETURN res;</span><br><span class="line">END IF;</span><br><span class="line">-- 如果piv_str中没有分割符，直接判断piv_str1和piv_str是否相等，相等 res_place=1</span><br><span class="line">IF instr(piv_str, p_sep, 1) = 0 THEN</span><br><span class="line">IF piv_str = piv_str1 THEN</span><br><span class="line">res_place:=1;</span><br><span class="line">res:= res_place;</span><br><span class="line">END IF;</span><br><span class="line">ELSE</span><br><span class="line">-- 循环按分隔符截取piv_str</span><br><span class="line">LOOP</span><br><span class="line">l_idx := instr(piv_str,p_sep);</span><br><span class="line">--</span><br><span class="line">res_place := res_place + 1;</span><br><span class="line">-- 当piv_str中还有分隔符时</span><br><span class="line">IF l_idx &gt; 0 THEN</span><br><span class="line">-- 截取第一个分隔符前的字段str</span><br><span class="line">str:= substr(piv_str,1,l_idx-1);</span><br><span class="line">-- 判断 str 和piv_str1 是否相等，相等则结束循环判断</span><br><span class="line">IF str = piv_str1 THEN</span><br><span class="line">res:= res_place;</span><br><span class="line">EXIT;</span><br><span class="line">END IF;</span><br><span class="line">piv_str := substr(piv_str,l_idx+length(p_sep));</span><br><span class="line">ELSE</span><br><span class="line">-- 当截取后的piv_str 中不存在分割符时，判断piv_str和piv_str1是否相等，相等 res=res_path</span><br><span class="line">IF piv_str = piv_str1 THEN</span><br><span class="line">res:= res_place;</span><br><span class="line">END IF;</span><br><span class="line">-- 无论最后是否相等，都跳出循环</span><br><span class="line">EXIT;</span><br><span class="line">END IF;</span><br><span class="line">END LOOP;</span><br><span class="line">-- 结束循环</span><br><span class="line">END IF;</span><br><span class="line">-- 返回res</span><br><span class="line">RETURN res;</span><br><span class="line">END FIND_IN_SET;</span><br></pre></td></tr></table></figure></p><p>对于某些查询mysql只需写出表达式就可以了，但是我写的oracle的需要写出表达式出来<br>例如：<br>sql代码：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">select * from tableA a left join tableB b on FIND_IN_SET(a.id ,b.aid) ;   -- mysql这样写就可以了</span><br></pre></td></tr></table></figure></p><p>sql代码：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">select * from tableA a left join tableB b on FIND_IN_SET(a.id ,b.aid) &gt;0; -- oracle就要写出具体的表达式</span><br></pre></td></tr></table></figure></p><p>参考文档：<br><a href="http://nbczw8750.iteye.com/blog/2317996" target="_blank" rel="noopener">Oracle 实现与mysql中find_in_set函数的兼容</a></p><p>成功创建后的SQL语句，用作记录<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line">CREATE OR REPLACE FUNCTION FIND_IN_SET(piv_str1 varchar2, piv_str2 varchar2, p_sep varchar2 := &apos;,&apos;)</span><br><span class="line">RETURN NUMBER IS</span><br><span class="line">l_idx    number:=0; -- 用于计算piv_str2中分隔符的位置</span><br><span class="line">str      varchar2(500);  -- 根据分隔符截取的子字符串</span><br><span class="line">piv_str  varchar2(500) := piv_str2; -- 将piv_str2赋值给piv_str</span><br><span class="line">res      number:=0; -- 返回结果</span><br><span class="line">res_place      number:=0;-- 原字符串在目标字符串中的位置</span><br><span class="line">BEGIN</span><br><span class="line">-- 如果字段是null 则返回0</span><br><span class="line">IF piv_str2 IS NULL THEN</span><br><span class="line">RETURN res;</span><br><span class="line">END IF;</span><br><span class="line">-- 如果piv_str中没有分割符，直接判断piv_str1和piv_str是否相等，相等 res_place=1</span><br><span class="line">IF instr(piv_str, p_sep, 1) = 0 THEN</span><br><span class="line">IF piv_str = piv_str1 THEN</span><br><span class="line">res_place:=1;</span><br><span class="line">res:= res_place;</span><br><span class="line">END IF;</span><br><span class="line">ELSE</span><br><span class="line">-- 循环按分隔符截取piv_str</span><br><span class="line">LOOP</span><br><span class="line">l_idx := instr(piv_str,p_sep);</span><br><span class="line">--</span><br><span class="line">res_place := res_place + 1;</span><br><span class="line">-- 当piv_str中还有分隔符时</span><br><span class="line">IF l_idx &gt; 0 THEN</span><br><span class="line">-- 截取第一个分隔符前的字段str</span><br><span class="line">str:= substr(piv_str,1,l_idx-1);</span><br><span class="line">-- 判断 str 和piv_str1 是否相等，相等则结束循环判断</span><br><span class="line">IF str = piv_str1 THEN</span><br><span class="line">res:= res_place;</span><br><span class="line">EXIT;</span><br><span class="line">END IF;</span><br><span class="line">piv_str := substr(piv_str,l_idx+length(p_sep));</span><br><span class="line">ELSE</span><br><span class="line">-- 当截取后的piv_str 中不存在分割符时，判断piv_str和piv_str1是否相等，相等 res=res_path</span><br><span class="line">IF piv_str = piv_str1 THEN</span><br><span class="line">res:= res_place;</span><br><span class="line">END IF;</span><br><span class="line">-- 无论最后是否相等，都跳出循环</span><br><span class="line">EXIT;</span><br><span class="line">END IF;</span><br><span class="line">END LOOP;</span><br><span class="line">-- 结束循环</span><br><span class="line">END IF;</span><br><span class="line">-- 返回res</span><br><span class="line">RETURN res;</span><br><span class="line">END FIND_IN_SET;</span><br></pre></td></tr></table></figure></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;find_in_set(str,strList)，寻找str在strList中的位置。&lt;/p&gt;
&lt;p&gt;sql代码：&lt;br&gt;&lt;figure class=&quot;highlight plain&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span cla
      
    
    </summary>
    
    
      <category term="Oracle" scheme="https://lookphp.github.io/tags/Oracle/"/>
    
      <category term="mysql" scheme="https://lookphp.github.io/tags/mysql/"/>
    
  </entry>
  
  <entry>
    <title>php安装oci8扩展</title>
    <link href="https://lookphp.github.io/2018/12/06/php%E5%AE%89%E8%A3%85oci8%E6%89%A9%E5%B1%95/"/>
    <id>https://lookphp.github.io/2018/12/06/php安装oci8扩展/</id>
    <published>2018-12-06T15:38:26.000Z</published>
    <updated>2018-12-11T15:39:16.650Z</updated>
    
    <content type="html"><![CDATA[<h1 id="适用环境"><a href="#适用环境" class="headerlink" title="适用环境"></a>适用环境</h1><ul><li>操作系统：Windows10 64位</li><li>PHPstudy集成环境</li></ul><h1 id="安装过程"><a href="#安装过程" class="headerlink" title="安装过程"></a>安装过程</h1><h2 id="安装一-配置文件开启扩展文件"><a href="#安装一-配置文件开启扩展文件" class="headerlink" title="安装一,配置文件开启扩展文件"></a><strong>安装一,配置文件开启扩展文件</strong></h2><p>在phpstudy集成工具中打开PHP的配置文件php.ini 。找到 <code>&quot;;extension=php_oci8.dll&quot;</code>这句话，将其前面的分号去掉，结果如下：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">extension=php_oci8.dll      ; Use with Oracle 10gR2 Instant Client</span><br><span class="line">extension=php_oci8_11g.dll  ; Use with Oracle 11gR2 Instant Client</span><br><span class="line">extension=php_pdo_oci.dll</span><br></pre></td></tr></table></figure></p><p>题外话，一般我们开启扩展支持，只需要在php.ini中打开扩展就可以。<br>比如要连接oracle数据库，我们就只要打开 php_oci8.dll 和 php_oci8_11g.dll 就可以了。但是我们打开后，查看phpinfo()并没有开启，也没错误提示，这个问题就有点大，经过一番百度后，发现还需要安装客户端，所以这里我们还需要下载oracle的客户端，直接下载只有客户端支持库的。</p><h2 id="安装二：下载并安装客户端"><a href="#安装二：下载并安装客户端" class="headerlink" title="安装二：下载并安装客户端"></a><strong>安装二</strong>：下载并安装客户端</h2><blockquote><p>下载地址：<br><a href="https://pan.baidu.com/s/1sYLcU3CslPrjZXJMUYf6XA" target="_blank" rel="noopener">32位链接</a>  密码: cp3v<br><a href="https://pan.baidu.com/s/1R9OmchJqJYqVUpN1Y9bJ4g" target="_blank" rel="noopener">64位链接</a>  密码: wdst</p></blockquote><p><strong>注意：</strong><br>这里的32位，64位不是指的Windows操作系统，而是要根据你安装的PHP的位数，就好比今天我纠结了好久的为什么不行，然后注意到安装的是64位的客户端，按照系统看的。而PHP却是32位的（我是用的是集成环境 phpStudy），后更换成32位的客户端安装就真的可以了。附：<a href="https://www.jianshu.com/p/901ff18eb97a" target="_blank" rel="noopener">如何判断PHP是32位，还是64位？</a></p><h2 id="配置系统变量"><a href="#配置系统变量" class="headerlink" title="配置系统变量"></a><strong>配置系统变量</strong></h2><p>将路径<code>D:\Program Files (x86)\Oracle\Instant Client\bin</code>添加到系统变量中。</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="https://upload-images.jianshu.io/upload_images/1463937-2e0ea7e47be4776a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="配置环境变量.png" title="">                </div>                <div class="image-caption">配置环境变量.png</div>            </figure><h2 id="根据Oracle服务器的配置，修改Instant-Client的配置"><a href="#根据Oracle服务器的配置，修改Instant-Client的配置" class="headerlink" title="根据Oracle服务器的配置，修改Instant Client的配置"></a><strong>根据Oracle服务器的配置，修改Instant Client的配置</strong></h2><p>Oracle服务器的配置地址：<code>D:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora</code></p><p>tnsnames.ora文件内容如下：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"># tnsnames.ora Network Configuration File: D:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora</span><br><span class="line"># Generated by Oracle configuration tools.</span><br><span class="line"></span><br><span class="line">LISTENER_ORCL =</span><br><span class="line">  (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">ORACLR_CONNECTION_DATA =</span><br><span class="line">  (DESCRIPTION =</span><br><span class="line">    (ADDRESS_LIST =</span><br><span class="line">      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))</span><br><span class="line">    )</span><br><span class="line">    (CONNECT_DATA =</span><br><span class="line">      (SID = CLRExtProc)</span><br><span class="line">      (PRESENTATION = RO)</span><br><span class="line">    )</span><br><span class="line">  )</span><br><span class="line"></span><br><span class="line">ORCL =</span><br><span class="line">  (DESCRIPTION =</span><br><span class="line">    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))</span><br><span class="line">    (CONNECT_DATA =</span><br><span class="line">      (SERVER = DEDICATED)</span><br><span class="line">      (SERVICE_NAME = orcl.16.22.64)</span><br><span class="line">    )</span><br><span class="line">  )</span><br></pre></td></tr></table></figure><p>参照服务器的配置，修改Instant Client的配置：<br>Instant Client的地址：<code>D:\Program Files (x86)\Oracle\Instant Client\network\admin\tnsnames.ora</code><br>tnsnames.ora文件内容：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"># tnsnames.ora Network Configuration File.</span><br><span class="line"># Generated by Oracle configuration tools.</span><br><span class="line"></span><br><span class="line"># Sample:</span><br><span class="line">#DatabaseName =</span><br><span class="line">#  (DESCRIPTION =</span><br><span class="line">#    (ADDRESS_LIST =</span><br><span class="line">#      (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))</span><br><span class="line">#    )</span><br><span class="line">#    (CONNECT_DATA =</span><br><span class="line">#      (SERVER = DEDICATED)</span><br><span class="line">#      (SERVICE_NAME = ServiceName)</span><br><span class="line">#      (INSTANCE_NAME = InstanceName)</span><br><span class="line">#    )</span><br><span class="line">#  )</span><br><span class="line"></span><br><span class="line"># Modify the following content to fit your own needs.</span><br><span class="line">ORCL=</span><br><span class="line">  (DESCRIPTION =</span><br><span class="line">    (ADDRESS_LIST =</span><br><span class="line">      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))</span><br><span class="line">    )</span><br><span class="line">    (CONNECT_DATA =</span><br><span class="line">      (SERVER = DEDICATED)</span><br><span class="line">      (SERVICE_NAME = ORCL</span><br><span class="line">    )</span><br><span class="line">  )</span><br></pre></td></tr></table></figure><p>至此，打开phpinfo页面，查看oci8的相关扩展信息是否开启，如图。</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="https://upload-images.jianshu.io/upload_images/1463937-4f89f596d7e59476.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="php的oci8扩展信息.png" title="">                </div>                <div class="image-caption">php的oci8扩展信息.png</div>            </figure><h2 id="使用如下代码链接Oracle时报错，报错信息如下"><a href="#使用如下代码链接Oracle时报错，报错信息如下" class="headerlink" title="使用如下代码链接Oracle时报错，报错信息如下"></a>使用如下代码链接Oracle时报错，报错信息如下</h2><p>链接代码：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">&lt;?php</span><br><span class="line">// Create connection to Oracle</span><br><span class="line"> $conn = oci_connect(&quot;数据库名称&quot;, &quot;数据库密码&quot;, &quot;//localhost/orcl&quot;);</span><br><span class="line"> if (!$conn) &#123;</span><br><span class="line">    $m = oci_error();</span><br><span class="line">    echo $m[&apos;message&apos;], &quot;\n&quot;;</span><br><span class="line">    exit;</span><br><span class="line"> &#125;</span><br><span class="line"> else &#123;</span><br><span class="line">   print &quot;Connected to Oracle!&quot;;</span><br><span class="line"> &#125;</span><br><span class="line">// // Close the Oracle connection</span><br><span class="line"> oci_close($conn);</span><br></pre></td></tr></table></figure><p>错误码：</p><p><code>Oracle 报错ORA-12514: TNS:listener does not currently know of service requested in connec</code></p><h2 id="通过上网查到可通过修改listener-ora文件解决第5步的错误"><a href="#通过上网查到可通过修改listener-ora文件解决第5步的错误" class="headerlink" title="通过上网查到可通过修改listener.ora文件解决第5步的错误"></a><strong>通过上网查到可通过修改listener.ora文件解决第5步的错误</strong></h2><p>添加了一段在安装目录D:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN 下文件修改了加上一段复制的代码（灰色选中部分）:<br><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="https://upload-images.jianshu.io/upload_images/1463937-98604d409ab23074.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="12514错误配置文件.png" title="">                </div>                <div class="image-caption">12514错误配置文件.png</div>            </figure></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">SID_LIST_LISTENER =</span><br><span class="line">  (SID_LIST =</span><br><span class="line">    (SID_DESC =</span><br><span class="line">      (SID_NAME = CLRExtProc)</span><br><span class="line">      (ORACLE_HOME = D:\app\Administrator\product\11.2.0\dbhome_1)</span><br><span class="line">      (PROGRAM = extproc)</span><br><span class="line">      (ENVS = &quot;EXTPROC_DLLS=ONLY:D:\app\Administrator\product\11.2.0\dbhome_1\bin\oraclr11.dll&quot;)</span><br><span class="line">    )(SID_DESC =</span><br><span class="line">    (GLOBAL_DBNAME = ORCL)</span><br><span class="line">    (ORACLE_HOME = D:\app\Administrator\product\11.2.0\dbhome_1)</span><br><span class="line">    (SID_NAME = ORCL)</span><br><span class="line">    )</span><br><span class="line">  )</span><br></pre></td></tr></table></figure><h2 id="关掉Service和LISTENER，再启动Service和LISTENER"><a href="#关掉Service和LISTENER，再启动Service和LISTENER" class="headerlink" title="关掉Service和LISTENER，再启动Service和LISTENER"></a>关掉Service和LISTENER，再启动Service和LISTENER</h2><p><strong>注意：</strong> 复制请留意到ORACLE_HOME =目录，复制目录一定是要本机文件目录，细节真的很重要！</p><p>参考文档：<br><a href="http://www.oracle.com/technetwork/cn/articles/dsl/technote-php-instant-090922-zhs.html?" target="_blank" rel="noopener">在 Linux 和 Windows 上安装 PHP 和 Oracle Instant Client</a><br><a href="http://blog.csdn.net/wang_quan_li/article/details/70671247" target="_blank" rel="noopener">PHP 无法开启 OCI8 扩展原因</a><br><a href="http://blog.csdn.net/u010832551/article/details/51162133" target="_blank" rel="noopener">Windows PHP/phpStudy 连接 甲骨文Oracle 数据库 oci8</a><br><a href="http://blog.csdn.net/u010832551/article/details/51162133" target="_blank" rel="noopener">Oracle 报错ORA-12514: TNS:listener does not currently know of service requested in connec</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;适用环境&quot;&gt;&lt;a href=&quot;#适用环境&quot; class=&quot;headerlink&quot; title=&quot;适用环境&quot;&gt;&lt;/a&gt;适用环境&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;操作系统：Windows10 64位&lt;/li&gt;
&lt;li&gt;PHPstudy集成环境&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 
      
    
    </summary>
    
    
      <category term="Oracle" scheme="https://lookphp.github.io/tags/Oracle/"/>
    
      <category term="php" scheme="https://lookphp.github.io/tags/php/"/>
    
  </entry>
  
  <entry>
    <title>阿里云https+nginx服务搭建及配置</title>
    <link href="https://lookphp.github.io/2018/12/06/%E9%98%BF%E9%87%8C%E4%BA%91https-nginx%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA%E5%8F%8A%E9%85%8D%E7%BD%AE/"/>
    <id>https://lookphp.github.io/2018/12/06/阿里云https-nginx服务搭建及配置/</id>
    <published>2018-12-06T15:08:44.000Z</published>
    <updated>2018-12-06T15:28:12.553Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>本文不会介绍https相关知识，只是把我创建https服务的过程分享出来，供读者参考。并且已经假设你已经购买了服务器和域名。</p></blockquote><h1 id="购买证书"><a href="#购买证书" class="headerlink" title="购买证书"></a>购买证书</h1><ul><li><p>通过控制台进入CA证书服务，点击右上角的购买证书，进入如下图的界面，选择免费1年的<code>Symantec</code>的<code>DV SSL</code>。</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-aaf16d595a87e4e5?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure></li><li><p>点击购买，一路点过去，然后回到证书服务主页，会出现一条订单信息，点击补全，如下图所示。</p></li></ul><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-463733e95fa510d6?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><p>-然后按照要求，首先填写你要申请证书的完整域名（例如<a href="http://www.test.com，因为此证书为单域名，不能使用通配符）；" target="_blank" rel="noopener">www.test.com，因为此证书为单域名，不能使用通配符）；</a></p><ul><li>然后填写个人信息，值得注意的是需要勾选下图红圈包围的选项，让验证自动化进行，不用手动操作；然后下一步，完成信息补全，等待几分钟，验证就可以通过。 </li></ul><p><img src="http://upload-images.jianshu.io/upload_images/1463937-d7869ce6a6be7162?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image"></p><h1 id="添加443端口（https）安全组规则"><a href="#添加443端口（https）安全组规则" class="headerlink" title="添加443端口（https）安全组规则"></a>添加443端口（https）安全组规则</h1><ul><li>为了安全，阿里云只开放了少部分的端口，像常见的80、443端口，都需要我们手动开启。在等待证书验证期间，你可以去检查一下你的服务器的安全组配置，看一下是否加入了443端口的链接，防止后面连接不上。创建的新规则如下图。</li></ul><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-4448f2f4db6a3504?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><h1 id="下载证书"><a href="#下载证书" class="headerlink" title="下载证书"></a>下载证书</h1><ul><li><p>几分钟后，可以看到下图的状态。</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-0763c1adaf5e13ac?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure></li><li><p>选择为nginx制作的证书，并下载到本地。</p></li></ul><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-d73ebd3370745848?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><h1 id="配置nginx服务器"><a href="#配置nginx服务器" class="headerlink" title="配置nginx服务器"></a>配置nginx服务器</h1><ul><li><p>把这个文件解压后，会有两个文件，分别为<code>****.pem</code>和<code>****.key</code>（可以修改成你需要的名字），将这两个文件拷贝到你的Nginx根目录下的cert文件夹内（自己创建的，也可以命名成其他名字）。</p></li><li><p>接下来就要配置Nginx服务器了。</p></li><li><p>如果你配置了反向代理，就去conf.d目录下，修改你要配置https的conf文件。下面贴一个范例配置。</p></li><li>其中端口80为http链接，设置为重定向https；端口443为https链接。</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">upstream blog &#123;</span><br><span class="line">  server 127.0.0.1:8080;</span><br><span class="line">&#125;</span><br><span class="line">server &#123;</span><br><span class="line">  listen 80;</span><br><span class="line">  server_name www.test.com;</span><br><span class="line">  return 301 https://$host$request_uri;</span><br><span class="line">&#125;</span><br><span class="line">server &#123;</span><br><span class="line">    listen 443 ssl;</span><br><span class="line">    server_name www.test.com;</span><br><span class="line">    index index.html;</span><br><span class="line">    ssl_certificate   /etc/nginx/cert/***.pem;</span><br><span class="line">    ssl_certificate_key  /etc/nginx/cert/***.key;</span><br><span class="line">    ssl_session_timeout 5m;</span><br><span class="line">    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;</span><br><span class="line">    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;</span><br><span class="line">    ssl_prefer_server_ciphers on;</span><br><span class="line">    location / &#123;</span><br><span class="line">    proxy_set_header  X-Forwarded-Host $host;</span><br><span class="line">    proxy_set_header  X-Forwarded-Proto $scheme;</span><br><span class="line">    proxy_set_header  X-Real-IP  $remote_addr;</span><br><span class="line">    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;</span><br><span class="line">    proxy_set_header Host $http_host;</span><br><span class="line">    proxy_redirect off;</span><br><span class="line">    expires off;</span><br><span class="line">    sendfile off;</span><br><span class="line">    proxy_pass http://test;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="修改防火墙规则"><a href="#修改防火墙规则" class="headerlink" title="修改防火墙规则"></a>修改防火墙规则</h1><ul><li>打开配置文件 <code>$ vim /etc/sysconfig/iptables</code> 增加443端口<br><code>-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT</code></li><li>重启iptables<br><code>service iptables restart</code></li></ul><h1 id="测试"><a href="#测试" class="headerlink" title="测试"></a>测试</h1><ul><li>配置完以后运行<code>nginx -t</code>查看配置文件是否有误。<ul><li>如果通过了运行 <code>nginx -s reload</code>重新加载配置，去浏览器输入链接，此时成功进入https链接✌️。</li></ul></li></ul><h1 id="配置过程中遇到的问题及解决办法"><a href="#配置过程中遇到的问题及解决办法" class="headerlink" title="配置过程中遇到的问题及解决办法"></a>配置过程中遇到的问题及解决办法</h1><ul><li><p>如何验证是否开启443端口？<br><code>telent www.你的域名.com 443</code></p></li><li><p>Nginx 配置 Https 出现no “ssl_certificate” is defined in server listening on SSL port while SSL handshaking怎么处理？</p></li></ul><blockquote><p>Solution:<br>you should need to add following to nginx server block<br>listen 443 default_server ssl;<br>example:-<br>server {<br>listen 443 ssl;<br>ssl_certificate   /etc/nginx/cert/<strong><strong>.pem;<br>ssl_certificate_key  /etc/nginx/cert/</strong></strong>.key;<br>}</p></blockquote><p>如上面所说，将server中的ssl声明复制一份到<code>nginx.conf</code>中的http模块中，或<code>conf.d/default.conf</code>中。http中声明的全局SSL证书只是个打酱油的，只是为了不让nginx报上述no “ssl_certificate” is defined的错误，真正生效的证书配置还是在server段。</p><h1 id="参考文档："><a href="#参考文档：" class="headerlink" title="参考文档："></a>参考文档：</h1><ul><li><a href="https://juejin.im/entry/59f0af426fb9a045076edffa" target="_blank" rel="noopener">基础搭建教程</a></li><li><a href="http://gitfree.me/2017/05/02/nginx-no-ssl-certificate-problem/" target="_blank" rel="noopener">Nginx 配置 Https 出现no “ssl_certificate” is defined问题原因及解决方法 </a></li><li><a href="https://www.tectut.com/2014/10/solved-no-ssl_certificate-is-defined-in-server-listening-on-ssl-port-while-ssl-handshaking-client/" target="_blank" rel="noopener">Solved no “ssl_certificate” is defined in server listening on SSL port while SSL handshaking, client</a></li><li><a href="http://ju.outofmemory.cn/entry/185812" target="_blank" rel="noopener">ssl certificate 配置记录</a></li><li><a href="http://tengine.taobao.org/book/chapter_05.html" target="_blank" rel="noopener">upstream模块</a></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;blockquote&gt;
&lt;p&gt;本文不会介绍https相关知识，只是把我创建https服务的过程分享出来，供读者参考。并且已经假设你已经购买了服务器和域名。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;购买证书&quot;&gt;&lt;a href=&quot;#购买证书&quot; class=&quot;header
      
    
    </summary>
    
    
      <category term="nginx" scheme="https://lookphp.github.io/tags/nginx/"/>
    
  </entry>
  
  <entry>
    <title>Vultr VPS搭建SS教程</title>
    <link href="https://lookphp.github.io/2018/04/12/Vultr-VPS%E6%90%AD%E5%BB%BASS%E6%95%99%E7%A8%8B/"/>
    <id>https://lookphp.github.io/2018/04/12/Vultr-VPS搭建SS教程/</id>
    <published>2018-04-12T14:46:09.000Z</published>
    <updated>2018-04-12T14:53:47.821Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Vultr-VPS搭建SS教程"><a href="#Vultr-VPS搭建SS教程" class="headerlink" title="Vultr VPS搭建SS教程"></a>Vultr VPS搭建SS教程</h1><blockquote><p>本系列文章自由转载，注明原文地址即可。</p></blockquote><h3 id="国外服务器的购买"><a href="#国外服务器的购买" class="headerlink" title="国外服务器的购买"></a>国外服务器的购买</h3><p>这里我选择的是Vultr，对比了很多国外的服务器，这个蛮靠谱的，且搭建成功后看youtube1080p完全无压力。</p><p>这里是链接：<a href="https://www.vultr.com/?ref=7391746" target="_blank" rel="noopener">Vultr The Infrastructure Cloud™</a></p><p>当然，已经有服务器的小伙伴，直接从==快速搭建ShadowSocks==开始看</p><h4 id="Vultr服务器价格"><a href="#Vultr服务器价格" class="headerlink" title="Vultr服务器价格"></a>Vultr服务器价格</h4><p>Vultr服务器按小时计费,最低0.004美元/h,算起来2.5美元/月，且destory掉服务器是不收费的，所以不用担心如果暂时没有使用还一直扣费的问题，如下图所示：</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-b0ee2070ab1c70a0?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><p>最低价格的服务器是512M的内存，500G的带宽，只能说99%的情况下完全够用了！</p><h4 id="注册Vultr"><a href="#注册Vultr" class="headerlink" title="注册Vultr"></a>注册Vultr</h4><p>首先打开<a href="https://www.vultr.com/?ref=7391746" target="_blank" rel="noopener">Vultr链接</a>，点击Create Account</p><h4 id="充值Vultr"><a href="#充值Vultr" class="headerlink" title="充值Vultr"></a>充值Vultr</h4><h4 id=""><a href="#" class="headerlink" title=""></a><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-25b9b2fa2e722a03?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure></h4><p>注册完成之后就是充值，Vultr提供4种充值方式，如下图：</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-4d9bb7d1e7e71e61?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><p>这里我选择支付宝，因为方便快捷，但是最低消费10美元，也不多，60多人民币，如下图：</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-3ff5b03d8ba9ce1b?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><p>付款之后，就可以看到账户的钱多了</p><h4 id="选择VPS的位置"><a href="#选择VPS的位置" class="headerlink" title="选择VPS的位置"></a>选择VPS的位置</h4><p>首先，位置很重要！我们如何选择呢，当然有科学的办法，ping它！</p><p>Vultr的服务器有很多位置，下面我测试的东京节点和新加坡节点的数据如下：</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-456db084bba8b5b7?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-a02e3dc3e9600357?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><p>这么看来还是东京的节点速度比较好，当然这个因人而异，在中国不同的地理位置访问国外不同位置的服务器速度也不一样。（下面提供了下载地址,下载下来双击运行即可）。</p><p>测速脚本下载地址：<br><a href="https://link.jianshu.com/?t=http%3A%2F%2Fp1hy9syru.bkt.clouddn.com%2F%25E6%25B5%258B%25E9%2580%259F.bat" target="_blank" rel="noopener">点我下载 测速.bat</a></p><p>脚本内容如下：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">@echo off</span><br><span class="line">echo ===========================================</span><br><span class="line">echo 东京</span><br><span class="line">ping hnd-jp-ping.vultr.com</span><br><span class="line"></span><br><span class="line">echo ============================================</span><br><span class="line">echo 新加坡</span><br><span class="line">ping sgp-ping.vultr.com</span><br><span class="line"></span><br><span class="line">echo ===========================================</span><br><span class="line">echo (AU) Sydney, Australia[悉尼]</span><br><span class="line">ping syd-au-ping.vultr.com</span><br><span class="line"></span><br><span class="line">echo ===========================================</span><br><span class="line">echo 德国 法兰克福</span><br><span class="line">ping fra-de-ping.vultr.com</span><br><span class="line"></span><br><span class="line">echo ===========================================</span><br><span class="line">echo 荷兰 阿姆斯特丹</span><br><span class="line">ping ams-nl-ping.vultr.com</span><br><span class="line"></span><br><span class="line">echo ===========================================</span><br><span class="line">echo 英国 伦敦</span><br><span class="line">ping lon-gb-ping.vultr.com</span><br><span class="line"></span><br><span class="line">echo ===========================================</span><br><span class="line">echo 法国 巴黎</span><br><span class="line">ping par-fr-ping.vultr.com</span><br><span class="line"></span><br><span class="line">echo ===========================================</span><br><span class="line">echo 美东 华盛顿州 西雅图</span><br><span class="line">ping wa-us-ping.vultr.com</span><br><span class="line"></span><br><span class="line">echo ===========================================</span><br><span class="line">echo 美西 加州 硅谷</span><br><span class="line">ping sjo-ca-us-ping.vultr.com</span><br><span class="line"></span><br><span class="line">echo ===========================================</span><br><span class="line">echo 美西 加州 洛杉矶</span><br><span class="line">ping lax-ca-us-ping.vultr.com</span><br><span class="line"></span><br><span class="line">echo ===========================================</span><br><span class="line">echo 美东 芝加哥</span><br><span class="line">Chicago, Illinois[美东 芝加哥]</span><br><span class="line">ping il-us-ping.vultr.com</span><br><span class="line"></span><br><span class="line">echo ===========================================</span><br><span class="line">echo 美中 德克萨斯州 达拉斯</span><br><span class="line">ping tx-us-ping.vultr.com</span><br><span class="line"></span><br><span class="line">echo ===========================================</span><br><span class="line">echo 美东 新泽西</span><br><span class="line">ping nj-us-ping.vultr.com</span><br><span class="line"></span><br><span class="line">echo ===========================================</span><br><span class="line">echo 美东 乔治亚州 亚特兰大</span><br><span class="line">ping ga-us-ping.vultr.com</span><br><span class="line"></span><br><span class="line">echo ===========================================</span><br><span class="line">echo 美东 佛罗里达州 迈阿密</span><br><span class="line">ping fl-us-ping.vultr.com   </span><br><span class="line">pause</span><br></pre></td></tr></table></figure><p>根据测速的结果，我选择东京位置的VPS</p><h4 id="创建VPS"><a href="#创建VPS" class="headerlink" title="创建VPS"></a>创建VPS</h4><p>左侧菜单栏Servers，点击+，如下图：</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-f377022df2f8593e?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><p>选择VPS的位置，如下图：</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-9fcddad1fa1f4f2c?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><p>选择操作系统和价格，如下图：</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-13d8d9431aa93dfc?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><p>点击最下面的Deploy Now，如下图：</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-ce9524cdb93bf9a8?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><p>创建成功</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-0371c482e45b279e?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><h4 id="VPS的信息"><a href="#VPS的信息" class="headerlink" title="VPS的信息"></a>VPS的信息</h4><p>安装成功之后，点击Manage</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-7dfe897ae67c9913?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><p>可以看到你购买的VPS的信息，如下图所示：</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-9263ff3c7b1dc257?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><p>ping一下ip地址，100ms多一点，这个速度相当可以了，如下图：</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-24265715369429c4?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><h3 id="VPS的使用"><a href="#VPS的使用" class="headerlink" title="VPS的使用"></a>VPS的使用</h3><h4 id="下载Shell"><a href="#下载Shell" class="headerlink" title="下载Shell"></a>下载Shell</h4><p>当然是选择先连接它了，我们选择的工具是XShell</p><p>下载地址：<a href="https://link.jianshu.com/?t=http%3A%2F%2Fp1hy9syru.bkt.clouddn.com%2FXshell5.zip" target="_blank" rel="noopener">Xshell下载</a></p><p>下载完成之后安装，下一步即可</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-4866459e2bb83a43?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><p>接着选择免费为家庭/学校</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-bc6e9b2061fbb519?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><p>语言选择中文：</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-f4f36624df9646e2?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><p>安装成功后打开</p><h4 id="连接VPS"><a href="#连接VPS" class="headerlink" title="连接VPS"></a>连接VPS</h4><p>打开Xshell，选择文件-&gt;新建，输入VPS的IP，IP地址就在Vultr的管理页面上，如下图所示：</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-7fd3edb2e067f981?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><p>点击确定，输入用户名，默认应该为root，如下图：</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-1c5bc0a6519b34b4?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><p>接着输入密码：</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-f4a5cf1ae3cdd8a6?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><p>连接成功：</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-79162e5e39322c2a?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><h3 id="快速搭建ShadowSocks-二选一"><a href="#快速搭建ShadowSocks-二选一" class="headerlink" title="快速搭建ShadowSocks(二选一)"></a>快速搭建ShadowSocks(二选一)</h3><h4 id="一键安装"><a href="#一键安装" class="headerlink" title="一键安装"></a>一键安装</h4><h5 id="使用方法"><a href="#使用方法" class="headerlink" title="使用方法"></a>使用方法</h5><p>在Xshell中依次运行以下命令</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">wget --no-check-certificate -O shadowsocks.sh https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks.sh</span><br><span class="line"></span><br><span class="line">chmod +x shadowsocks.sh</span><br><span class="line"></span><br><span class="line">./shadowsocks.sh 2&gt;&amp;1 | tee shadowsocks.log</span><br></pre></td></tr></table></figure><p>接着按照提醒输入你的密码，端口和加密方式，如下图：</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-6ac3a3e22551fe11?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-4664fd091cd40fb9?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><p>然后可以去听首歌~，成功安装之后有你配置的信息显示，记住这些信息，然后跳过下面的手动安装部分，直接去看客户端连接部分即可，如下图：</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-d9803a1641626698?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><blockquote><p>以上脚本来源于秋水逸冰</p></blockquote><h4 id="手动安装"><a href="#手动安装" class="headerlink" title="手动安装"></a>手动安装</h4><h5 id="安装依赖包"><a href="#安装依赖包" class="headerlink" title="安装依赖包"></a>安装依赖包</h5><p>在XShell的控制台输入：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">curl &quot;https://bootstrap.pypa.io/get-pip.py&quot; -o &quot;get-pip.py&quot;</span><br><span class="line">python get-pip.py</span><br></pre></td></tr></table></figure><p>一个个的来，如下图：</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-1e0c2b77b435c4f6?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><h5 id="安装ShadowSocks"><a href="#安装ShadowSocks" class="headerlink" title="安装ShadowSocks"></a>安装ShadowSocks</h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">pip install --upgrade pip</span><br><span class="line">pip install shadowsocks</span><br></pre></td></tr></table></figure><p>如下图：</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-bddee0a478732369?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><h5 id="创建ShadowSocks配置文件"><a href="#创建ShadowSocks配置文件" class="headerlink" title="创建ShadowSocks配置文件"></a>创建ShadowSocks配置文件</h5><h6 id="单端口"><a href="#单端口" class="headerlink" title="单端口"></a>单端口</h6><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vi /etc/shadowsocks.json</span><br></pre></td></tr></table></figure><p>输入以下内容，然后点ESC后输入:wq保存退出</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  &quot;server&quot;: &quot;0.0.0.0&quot;,</span><br><span class="line">  &quot;server_port&quot;: 2018,</span><br><span class="line">  &quot;password&quot;: &quot;12345678&quot;,</span><br><span class="line">  &quot;method&quot;: &quot;aes-256-cfb&quot;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h6 id="多端口"><a href="#多端口" class="headerlink" title="多端口"></a>多端口</h6><p>（可选，配置了单端口就不要配置这个）多端口的配置文件如下：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">    &quot;server&quot;: &quot;0.0.0.0&quot;,</span><br><span class="line">    &quot;port_password&quot;: &#123;</span><br><span class="line">        &quot;8381&quot;: &quot;password1&quot;,</span><br><span class="line">        &quot;8382&quot;: &quot;password2&quot;,</span><br><span class="line">        &quot;8383&quot;: &quot;password3&quot;,</span><br><span class="line">        &quot;8384&quot;: &quot;password4&quot;</span><br><span class="line">    &#125;,</span><br><span class="line">    &quot;timeout&quot;: 300,</span><br><span class="line">    &quot;method&quot;: &quot;aes-256-cfb&quot;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>我采取的是单端口配置，如下图所示：</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-7b774c9018ea5f04?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-51cbe21b01eb1739?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><h5 id="配置防火墙"><a href="#配置防火墙" class="headerlink" title="配置防火墙"></a>配置防火墙</h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl stop firewalld.service</span><br></pre></td></tr></table></figure><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-6aff0363b7c685fa?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><h5 id="启动ShadowSocks服务"><a href="#启动ShadowSocks服务" class="headerlink" title="启动ShadowSocks服务"></a>启动ShadowSocks服务</h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssserver -c /etc/shadowsocks.json -d start</span><br></pre></td></tr></table></figure><p>如图所示：</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-53af28cdee91182c?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><p>下面的是关闭，启动成功之后不要执行</p><h5 id="关闭ShadowSocks服务"><a href="#关闭ShadowSocks服务" class="headerlink" title="关闭ShadowSocks服务"></a>关闭ShadowSocks服务</h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssserver -c /etc/shadowsocks.json -d stop</span><br></pre></td></tr></table></figure><h3 id="连接ShadowSocks，体会科学上网的魅力"><a href="#连接ShadowSocks，体会科学上网的魅力" class="headerlink" title="连接ShadowSocks，体会科学上网的魅力"></a>连接ShadowSocks，体会科学上网的魅力</h3><h4 id="Windows客户端"><a href="#Windows客户端" class="headerlink" title="Windows客户端"></a>Windows客户端</h4><p>下载地址：<br><a href="https://link.jianshu.com/?t=http%3A%2F%2Fp1hy9syru.bkt.clouddn.com%2FShadowsocks-4.0.7.zip" target="_blank" rel="noopener">Shadowsocks-4.0.7.zip</a></p><p>下载完成之后解压打开，如下图所示：</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-bc4e68f14b3efc7b?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><p>按照你自己的配置完成之后，点击确定，然后在托盘中右键这个小飞机，启动系统代理<br>，灰色的小飞机就会亮起来，如下图：</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-d55d2f90b2ff2efe?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><p>然后就可以畅游网络了~</p><p>测试地址：</p><ul><li><a href="https://link.jianshu.com/?t=https%3A%2F%2Fwww.google.com.hk%2F" target="_blank" rel="noopener">谷歌</a></li><li><a href="https://link.jianshu.com/?t=https%3A%2F%2Fwww.youtube.com%2F" target="_blank" rel="noopener">Youtube</a></li><li><a href="https://link.jianshu.com/?t=https%3A%2F%2Ftwitter.com%2F%3Flang%3Dzh-cn" target="_blank" rel="noopener">推特</a></li></ul><h4 id="安卓连接"><a href="#安卓连接" class="headerlink" title="安卓连接"></a>安卓连接</h4><p>下载地址：<a href="https://link.jianshu.com/?t=http%3A%2F%2Fp1hy9syru.bkt.clouddn.com%2Fshadowsocks.apk" target="_blank" rel="noopener">shadowsocks.apk</a></p><p>配置和windows差不多，配置完成后点击右上角的开启按钮即可，如下图：</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-2e0e89620cd7dd90?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><h4 id="IOS连接"><a href="#IOS连接" class="headerlink" title="IOS连接"></a>IOS连接</h4><p>参考链接：<a href="https://link.jianshu.com/?t=http%3A%2F%2Fwww.360doc.com%2Fcontent%2F17%2F0614%2F06%2F37032448_662846097.shtml" target="_blank" rel="noopener">http://www.360doc.com/content/17/0614/06/37032448_662846097.shtml</a></p><h4 id="MAC-连接"><a href="#MAC-连接" class="headerlink" title="MAC 连接"></a>MAC 连接</h4><p>下载地址：<br><a href="https://link.jianshu.com/?t=http%3A%2F%2Fp1hy9syru.bkt.clouddn.com%2FShadowsocksX-2.6.3.dmg" target="_blank" rel="noopener">ShadowsocksX-2.6.3.dmg</a></p><h3 id="测试结果"><a href="#测试结果" class="headerlink" title="测试结果"></a>测试结果</h3><p>4K Youtube完成无压力</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-845cd2e94c0a6d8c?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image" title="">                </div>                <div class="image-caption">image</div>            </figure><h3 id="写在后面的话"><a href="#写在后面的话" class="headerlink" title="写在后面的话"></a>写在后面的话</h3><p>搭建完成后推荐看这篇文章，完成对网速的优化：<a href="https://link.jianshu.com/?t=http%3A%2F%2Fwww.hellojava.club%2Farticle%2F5" target="_blank" rel="noopener">VPS搭建BBR加速教程（youtube1440p无压力）</a></p><p>如果想多利用<a href="https://www.vultr.com/?ref=7391746" target="_blank" rel="noopener">Vultr</a>，搭建个人博客，看这篇文章：<a href="https://link.jianshu.com/?t=http%3A%2F%2Fwww.hellojava.club%2Farticle%2F7" target="_blank" rel="noopener">10分钟搭建Java开源博客Tale-超详细</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;Vultr-VPS搭建SS教程&quot;&gt;&lt;a href=&quot;#Vultr-VPS搭建SS教程&quot; class=&quot;headerlink&quot; title=&quot;Vultr VPS搭建SS教程&quot;&gt;&lt;/a&gt;Vultr VPS搭建SS教程&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;本系列文章
      
    
    </summary>
    
    
      <category term="ss" scheme="https://lookphp.github.io/tags/ss/"/>
    
      <category term="vps" scheme="https://lookphp.github.io/tags/vps/"/>
    
  </entry>
  
  <entry>
    <title>ElasticSearch CURD</title>
    <link href="https://lookphp.github.io/2018/03/30/ElasticSearch-CURD/"/>
    <id>https://lookphp.github.io/2018/03/30/ElasticSearch-CURD/</id>
    <published>2018-03-29T16:21:50.000Z</published>
    <updated>2018-03-29T16:29:15.815Z</updated>
    
    <content type="html"><![CDATA[<h1 id="开始使用"><a href="#开始使用" class="headerlink" title="开始使用"></a>开始使用</h1><p>接下来，我们看看如何建立索引、创建文档等，就好比在 MySQL 中进行诸如创建数据库，插入数据等操作。</p><p>Index:创建与更新索引</p><p>在ElasticSearch中，Index这一动作类比于CRUD中的Create与Update，当我们尝试为某个不存在的文档建立索引时，会自动根据其类似于ID创建新的文档，否则就会对原有的文档进行修改。</p><p>ElasticSearch使用PUT请求来进行Index操作，你需要提供索引名称、类型名称以及可选的ID，格式规范为:<a href="http://localhost:9200///[]。其中索引名称可以是任意字符，如果ElasticSearch中并不存在该索引则会自动创建。" target="_blank" rel="noopener">http://localhost:9200///[]。其中索引名称可以是任意字符，如果ElasticSearch中并不存在该索引则会自动创建。</a></p><h2 id="添加文档"><a href="#添加文档" class="headerlink" title="添加文档"></a>添加文档</h2><p>下面，我们将创建一个存储电影信息的Document :</p><ul><li>Index 的名称为movie</li><li>Type 的名称为adventure</li><li>Document 有两个字段： name和actors</li></ul><p>我们使用 Elasticsearch 提供的 RESTful API 来执行上述操作，如图所示：</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="http://upload-images.jianshu.io/upload_images/1463937-92bc1400f4f5b7a2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png" title="">                </div>                <div class="image-caption">image.png</div>            </figure><ul><li>用 <code>url</code>表示一个资源，比如 <code>/movie/adventure/1</code> 就表示一个<code>index</code> 为 <code>movie</code>，<code>type</code> 为 <code>adventure</code>，<code>id</code>为 <code>1</code> 的 <code>document</code></li><li>用 <code>http</code> 方法操作资源，如使用 <code>GET</code> 获取资源，使用 <code>POST、PUT</code>新增或更新资源，使用 <code>DELETE</code> 删除资源等</li></ul><p>向指定的<code>/Index/Type</code> 发送 <code>PUT</code> 请求，就可以在<code>Index</code> 里面新增一条记录。比如，向<code>/movie/adventure</code>发送请求，就可以新增电影记录。</p><p>我们可以使用 curl 命令来执行上述操作：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">curl -XPUT &quot;http://localhost:9200/movie/adventure/1&quot; -d &apos;</span><br><span class="line">&#123;</span><br><span class="line">    &quot;name&quot;: &quot;Life of Pi&quot;,</span><br><span class="line">    &quot;actors&quot;: [&quot;Suraj&quot; , &quot;Irrfan&quot;]</span><br><span class="line">&#125;&apos;</span><br></pre></td></tr></table></figure><p>如果可以，推荐使用<a href="https://httpie.org/" target="_blank" rel="noopener">httpie</a>，类似 curl，但比 curl 更好用，将上面的命令换成 httpie，如下：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http put :9200/movie/adventure/1 name=&quot;Life of Pi&quot; actors:=&apos;[&quot;Suraj&quot;, &quot;Irrfan&quot;]&apos;</span><br></pre></td></tr></table></figure></p><p>服务器返回的 JSON 对象，会给出<code>Index、Type、Id、Version</code> 等信息。<br>成功返回的结果：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">    &quot;_index&quot;: &quot;movie&quot;,</span><br><span class="line">    &quot;_type&quot;: &quot;adventure&quot;,</span><br><span class="line">    &quot;_id&quot;: &quot;1&quot;,</span><br><span class="line">    &quot;_version&quot;: 1,</span><br><span class="line">    &quot;result&quot;: &quot;created&quot;,</span><br><span class="line">    &quot;_shards&quot;: &#123;</span><br><span class="line">        &quot;total&quot;: 2,</span><br><span class="line">        &quot;successful&quot;: 1,</span><br><span class="line">        &quot;failed&quot;: 0</span><br><span class="line">    &#125;,</span><br><span class="line">    &quot;created&quot;: true</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>可以看到，我们已经成功创建了一个 <code>_index</code> 为 <code>movie</code>，<code>_type</code> 为 <code>adventure</code>，<code>_id</code> 为 1 的文档，最后的1是该条记录的 Id。它不一定是数字，任意字符串（比如abc）都可以。</p><p>ElasticSearch对于PUT请求的响应中包含了是否操作成功、文档编号等信息。</p><h2 id="查询GET"><a href="#查询GET" class="headerlink" title="查询GET"></a>查询GET</h2><p>我们通过 GET 请求来查看这个文档的信息：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -XGET localhost:9200/movie/adventure/1</span><br></pre></td></tr></table></figure></p><p>结果如下：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">    &quot;_index&quot;: &quot;movie&quot;,</span><br><span class="line">    &quot;_type&quot;: &quot;adventure&quot;,</span><br><span class="line">    &quot;_id&quot;: &quot;1&quot;,</span><br><span class="line">    &quot;_version&quot;: 1,</span><br><span class="line">    &quot;found&quot;: true,</span><br><span class="line">    &quot;_source&quot;: &#123;</span><br><span class="line">        &quot;name&quot;: &quot;Life of Pi&quot;,</span><br><span class="line">        &quot;actors&quot;: [</span><br><span class="line">            &quot;Suraj&quot;,</span><br><span class="line">            &quot;Irrfan&quot;</span><br><span class="line">        ]</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>可以看到，原始的文档数据存在了 <code>_source</code> 字段中。</p><p><strong>新增记录的时候，也可以不指定 Id，这时要改成 “POST” 请求。</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">curl -X POST &apos;localhost:9200/movie/adventure&apos; -d &apos;</span><br><span class="line">&#123;</span><br><span class="line">  &quot;name&quot;: &quot;Life of Pi&quot;</span><br><span class="line">&#125;&apos;</span><br></pre></td></tr></table></figure></p><h2 id="更新整个文档"><a href="#更新整个文档" class="headerlink" title="更新整个文档"></a>更新整个文档</h2><p>更新记录就是使用 PUT 请求，重新发送一次数据。不过我们这次务必要加上需要修改的文档的ID编号，否则就变成添加了。接下来我们尝试对刚才新建立的文档进行些修改，添加某些关键字属性。</p><p>当我们使用 PUT 方法指明文档的 <code>_index</code>, <code>_type</code> 和<code>_id</code>时，如果 <code>_id</code> 已存在，则新文档会替换旧文档，此时文档的 <code>_version</code> 会增加 1，并且 <code>_created</code> 字段为 <code>false</code>。比如：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">curl -XPUT &quot;http://localhost:9200/movie/adventure/1&quot; -d&apos;</span><br><span class="line">&#123;</span><br><span class="line">    &quot;name&quot;: &quot;Life of Pi&quot;</span><br><span class="line">&#125;&apos;</span><br></pre></td></tr></table></figure></p><p>返回的结果：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">    &quot;_index&quot;: &quot;movie&quot;,</span><br><span class="line">    &quot;_type&quot;: &quot;adventure&quot;,</span><br><span class="line">    &quot;_id&quot;: &quot;1&quot;,</span><br><span class="line">    &quot;_version&quot;: 2,</span><br><span class="line">    &quot;result&quot;: &quot;updated&quot;,</span><br><span class="line">    &quot;_shards&quot;: &#123;</span><br><span class="line">        &quot;total&quot;: 2,</span><br><span class="line">        &quot;successful&quot;: 1,</span><br><span class="line">        &quot;failed&quot;: 0</span><br><span class="line">    &#125;,</span><br><span class="line">    &quot;created&quot;: false</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><h2 id="添加和修改的比较"><a href="#添加和修改的比较" class="headerlink" title="添加和修改的比较"></a>添加和修改的比较</h2><p>对于此操作的ElasticSearch的响应与前者很类似，不过可以看出<code>_version</code>属性值已经发生了变化：</p><table><thead><tr><th style="text-align:left">变化的字段</th><th style="text-align:left">添加</th><th>修改</th></tr></thead><tbody><tr><td style="text-align:left">_version</td><td style="text-align:left">1</td><td>2</td></tr><tr><td style="text-align:left">result</td><td style="text-align:left">created</td><td>updated</td></tr><tr><td style="text-align:left">created</td><td style="text-align:left">true</td><td>false</td></tr></tbody></table><p><strong>GET</strong><br>最简单的获取某个文档的方式即是基于文档ID进行搜索<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -XGET &apos;http://localhost:9200/movie/adventure/1?pretty=true&apos;</span><br></pre></td></tr></table></figure></p><p>返回的结果：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  &quot;_index&quot; : &quot;movie&quot;,</span><br><span class="line">  &quot;_type&quot; : &quot;adventure&quot;,</span><br><span class="line">  &quot;_id&quot; : &quot;1&quot;,</span><br><span class="line">  &quot;_version&quot; : 2,</span><br><span class="line">  &quot;found&quot; : true,</span><br><span class="line">  &quot;_source&quot; : &#123;</span><br><span class="line">    &quot;name&quot; : &quot;Life of Pi&quot;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>可以看到，<code>actors</code> 这个字段已经不存在了，文档的 <code>_version</code> 变成了 2。</p><h2 id="如何避免原文档被替换？"><a href="#如何避免原文档被替换？" class="headerlink" title="如何避免原文档被替换？"></a>如何避免原文档被替换？</h2><p>因此，为了避免在误操作的情况下，原文档被替换，我们可以使用<code>_create</code> 这个 API，表示只在文档不存在的情况下才创建新文档（返回 201 Created），如果文档存在则不做任何操作（返回 409 Conflict），命令如下：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">curl -XPUT &quot;http://localhost:9200/movie/adventure/1/_create&quot; -d&apos;</span><br><span class="line">&#123;                       </span><br><span class="line">    &quot;name&quot;: &quot;Life of Pi&quot;</span><br><span class="line">&#125;&apos;</span><br></pre></td></tr></table></figure></p><p>由于文档 id 存在，会返回 409 Conflict。结果如下：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">    &quot;error&quot;: &#123;</span><br><span class="line">        &quot;root_cause&quot;: [</span><br><span class="line">            &#123;</span><br><span class="line">                &quot;type&quot;: &quot;version_conflict_engine_exception&quot;,</span><br><span class="line">                &quot;reason&quot;: &quot;[adventure][1]: version conflict, document already exists (current version [2])&quot;,</span><br><span class="line">                &quot;index_uuid&quot;: &quot;Kn_OWg1TT5GLaMInWlREHQ&quot;,</span><br><span class="line">                &quot;shard&quot;: &quot;3&quot;,</span><br><span class="line">                &quot;index&quot;: &quot;movie&quot;</span><br><span class="line">            &#125;</span><br><span class="line">        ],</span><br><span class="line">        &quot;type&quot;: &quot;version_conflict_engine_exception&quot;,</span><br><span class="line">        &quot;reason&quot;: &quot;[adventure][1]: version conflict, document already exists (current version [2])&quot;,</span><br><span class="line">        &quot;index_uuid&quot;: &quot;Kn_OWg1TT5GLaMInWlREHQ&quot;,</span><br><span class="line">        &quot;shard&quot;: &quot;3&quot;,</span><br><span class="line">        &quot;index&quot;: &quot;movie&quot;</span><br><span class="line">    &#125;,</span><br><span class="line">    &quot;status&quot;: 409</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><h2 id="局部更新"><a href="#局部更新" class="headerlink" title="局部更新"></a>局部更新</h2><p>在有些情况下，我们只想更新文档的局部，而不是整个文档，这时我们可以使用 <code>_update</code> 这个 API。</p><p>现在，待更新的文档信息如下：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  &quot;_index&quot; : &quot;movie&quot;,</span><br><span class="line">  &quot;_type&quot; : &quot;adventure&quot;,</span><br><span class="line">  &quot;_id&quot; : &quot;1&quot;,</span><br><span class="line">  &quot;_version&quot; : 2,</span><br><span class="line">  &quot;found&quot; : true,</span><br><span class="line">  &quot;_source&quot; : &#123;</span><br><span class="line">    &quot;name&quot; : &quot;Life of Pi&quot;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>最简单的 update 请求接受一个局部文档参数 <code>doc</code>，它会合并到现有文档中，请求方式需要变更为POST方式：将对象合并在一起，存在的标量字段被覆盖，新字段被添加。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">curl -XPOST &quot;http://localhost:9200/movie/adventure/1/_update&quot; -d&apos;</span><br><span class="line">&#123;</span><br><span class="line">    &quot;doc&quot;: &#123;</span><br><span class="line">      &quot;name&quot;: &quot;life of pi&quot;,</span><br><span class="line">      &quot;actor&quot;: [&quot;jack&quot;]</span><br><span class="line">   &#125;</span><br><span class="line">&#125;&apos;</span><br></pre></td></tr></table></figure><p>上面的命令中，我们添加了一个新的字段：<code>actors</code>，结果如下：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  &quot;_index&quot; : &quot;movie&quot;,</span><br><span class="line">  &quot;_type&quot; : &quot;adventure&quot;,</span><br><span class="line">  &quot;_id&quot; : &quot;1&quot;,</span><br><span class="line">  &quot;_version&quot; : 8,</span><br><span class="line">  &quot;found&quot; : true,</span><br><span class="line">  &quot;_source&quot; : &#123;</span><br><span class="line">    &quot;name&quot; : &quot;life of pi&quot;,</span><br><span class="line">    &quot;actor&quot; : [</span><br><span class="line">      &quot;jack&quot;</span><br><span class="line">    ]</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><h2 id="Delete-删除索引"><a href="#Delete-删除索引" class="headerlink" title="Delete:删除索引"></a>Delete:删除索引</h2><p>现在我们尝试去删除上文中插入的部分文档，对于要删除的文档同样需要传入索引名、类型名与文档名这些信息，譬如:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -XDELETE &quot;http://localhost:9200/movie/adventure/1&quot;</span><br></pre></td></tr></table></figure></p><p>返回的结果：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">    &quot;found&quot;: true,</span><br><span class="line">    &quot;_index&quot;: &quot;movie&quot;,</span><br><span class="line">    &quot;_type&quot;: &quot;adventure&quot;,</span><br><span class="line">    &quot;_id&quot;: &quot;1&quot;,</span><br><span class="line">    &quot;_version&quot;: 3,</span><br><span class="line">    &quot;result&quot;: &quot;deleted&quot;,</span><br><span class="line">    &quot;_shards&quot;: &#123;</span><br><span class="line">        &quot;total&quot;: 2,</span><br><span class="line">        &quot;successful&quot;: 1,</span><br><span class="line">        &quot;failed&quot;: 0</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>在我们删除了该文档之后，再次尝试用GET方法获取该文档信息时，会得到如下的响应:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  &quot;_index&quot; : &quot;movie&quot;,</span><br><span class="line">  &quot;_type&quot; : &quot;adventure&quot;,</span><br><span class="line">  &quot;_id&quot; : &quot;1&quot;,</span><br><span class="line">  &quot;found&quot; : false</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><h2 id="查看当前节点的所有-Index"><a href="#查看当前节点的所有-Index" class="headerlink" title="查看当前节点的所有 Index"></a>查看当前节点的所有 Index</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://localhost:9200/_cat/indices?v</span><br></pre></td></tr></table></figure><p>返回的结果：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">health status index       uuid                   pri rep docs.count docs.deleted store.size pri.store.size</span><br><span class="line">yellow open   my_index    aBM6KLOLSJ6TWtp87sC5qA   5   1          1            0      4.1kb          4.1kb</span><br><span class="line">yellow open   accounts    2i3MNbwCSeSxZCBDikaMzA   5   1          2            0      7.9kb          7.9kb</span><br><span class="line">yellow open   movies      -uB5sD6QTt6vmD4YPpJFaQ   5   1          1            0      5.1kb          5.1kb</span><br><span class="line">yellow open   liuxingwang 6KRPO9fJRVmWC7X3G69HQQ   5   1          0            0       955b           955b</span><br></pre></td></tr></table></figure></p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><ul><li>Elasticsearch 通过简单的 RESTful API 来隐藏 Lucene 的复杂性，从而让全文搜索变得简单</li><li>在创建文档时，我们可以用 POST 方法指定将文档添加到某个 <code>_index/_type</code>下，来让 Elasticsearch自动生成唯一的 <code>_id</code>；</li><li>而用 PUT 方法指定将文档的 <code>_index/_type/_id</code></li><li>我们看不到HTTP头是因为我们没有让<code>curl</code>显示它们，如果要显示，使用curl命令后跟<code>-i</code>参数:</li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;开始使用&quot;&gt;&lt;a href=&quot;#开始使用&quot; class=&quot;headerlink&quot; title=&quot;开始使用&quot;&gt;&lt;/a&gt;开始使用&lt;/h1&gt;&lt;p&gt;接下来，我们看看如何建立索引、创建文档等，就好比在 MySQL 中进行诸如创建数据库，插入数据等操作。&lt;/p&gt;
&lt;p&gt;Ind
      
    
    </summary>
    
    
      <category term="ElasticSearch" scheme="https://lookphp.github.io/tags/ElasticSearch/"/>
    
  </entry>
  
  <entry>
    <title>ElasticSearch快速入门</title>
    <link href="https://lookphp.github.io/2018/03/22/ElasticSearch%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/"/>
    <id>https://lookphp.github.io/2018/03/22/ElasticSearch快速入门/</id>
    <published>2018-03-22T15:33:11.000Z</published>
    <updated>2018-03-22T15:40:45.776Z</updated>
    
    <content type="html"><![CDATA[<p>在安装 Elasticsearch 之前，请确保你的计算机已经安装了 Java。目前 Elasticsearch 的最新版是 5.2，需要安装 Java 8，如果你用的是老版本的 Elasticsearch，如 2.x 版，可用 Java 7，但还是推荐使用 Java 8。</p><h1 id="安装前检查"><a href="#安装前检查" class="headerlink" title="安装前检查"></a>安装前检查</h1><h2 id="可以使用如下的命令检查-Java-的版本"><a href="#可以使用如下的命令检查-Java-的版本" class="headerlink" title="可以使用如下的命令检查 Java 的版本"></a>可以使用如下的命令检查 Java 的版本</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ java -version</span><br></pre></td></tr></table></figure><p>接着，我们可以从<a href="https://link.juejin.im/?target=https%3A%2F%2Fwww.elastic.co%2Fdownloads%2Felasticsearch" target="_blank" rel="noopener">这里</a>下载最新版本的 Elasticsearch，也可使用 wget 下载，如下：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.1.tar.gz</span><br></pre></td></tr></table></figure></p><h2 id="下载完后进行解压"><a href="#下载完后进行解压" class="headerlink" title="下载完后进行解压"></a>下载完后进行解压</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ tar -zxvf elasticsearch-5.5.1.tar.gz</span><br></pre></td></tr></table></figure><h1 id="运行"><a href="#运行" class="headerlink" title="运行"></a>运行</h1><p><strong><em>注意：启动elasticsearch的用户不能是root。</em></strong></p><p>首先，我们进入到刚刚解压出来的目录中：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ cd elasticsearch-5.5.1</span><br></pre></td></tr></table></figure></p><p>接着，使用如下命令启动 Elasticsearch：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ ./bin/elasticsearch</span><br></pre></td></tr></table></figure></p><p>此时，如果正常的话，你可以在终端看到类似如下的输出：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">[2017-03-04T23:25:09,961][INFO ][o.e.n.Node               ] [] initializing ...</span><br><span class="line">[2017-03-04T23:25:10,073][INFO ][o.e.e.NodeEnvironment    ] [yO11WLM] using [1] data paths, mounts [[/ (/dev/disk0s2)]], net usable_space [141.1gb], net total_space [232.9gb], spins? [unknown], types [hfs]</span><br><span class="line">[2017-03-04T23:25:10,074][INFO ][o.e.e.NodeEnvironment    ] [yO11WLM] heap size [1.9gb], compressed ordinary object pointers [true]</span><br><span class="line">[2017-03-04T23:25:10,095][INFO ][o.e.n.Node               ] node name [yO11WLM] derived from node ID [yO11WLMOQDuAOpZbYZYjzw]; set [node.name] to override</span><br><span class="line">[2017-03-04T23:25:10,100][INFO ][o.e.n.Node               ] version[5.5.1], pid[7607], build[db0d481/2017-02-09T22:05:32.386Z], OS[Mac OS X/10.11.5/x86_64], JVM[Oracle Corporation/Java HotSpot(TM) 64-Bit Server VM/1.8.0_102/25.102-b14]</span><br><span class="line">[2017-03-04T23:25:11,363][INFO ][o.e.p.PluginsService     ] [yO11WLM] loaded module [aggs-matrix-stats]</span><br><span class="line">...</span><br></pre></td></tr></table></figure></p><p>上面的命令是在前台运行的，如果想在后台以守护进程模式运行，可以加 -d 参数。</p><p>Elasticsearch 启动后，也启动了两个端口 9200 和 9300：</p><ul><li>9200 端口：HTTP RESTful 接口的通讯端口</li><li>9300 端口：TCP 通讯端口，用于集群间节点通信和与 Java 客户端通信的端口</li></ul><h2 id="默认运行端口"><a href="#默认运行端口" class="headerlink" title="默认运行端口"></a>默认运行端口</h2><p>安装成功后，Elastic 就会在默认的9200端口运行。</p><h2 id="请求地址"><a href="#请求地址" class="headerlink" title="请求地址"></a>请求地址</h2><p>现在，让我们做一些测试。在浏览器访问链接<a href="http://localhost:9200/，或使用" target="_blank" rel="noopener">http://localhost:9200/，或使用</a> curl 命令：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl &apos;http://localhost:9200/?pretty&apos;</span><br></pre></td></tr></table></figure></p><p>我们可以看到类似如下的输出：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">    &quot;name&quot;: &quot;MxO5-r8&quot;,</span><br><span class="line">    &quot;cluster_name&quot;: &quot;elasticsearch&quot;,</span><br><span class="line">    &quot;cluster_uuid&quot;: &quot;uQakSfM7Qi-cphDkxwRdxg&quot;,</span><br><span class="line">    &quot;version&quot;: &#123;</span><br><span class="line">        &quot;number&quot;: &quot;5.5.1&quot;,</span><br><span class="line">        &quot;build_hash&quot;: &quot;19c13d0&quot;,</span><br><span class="line">        &quot;build_date&quot;: &quot;2017-07-18T20:44:24.823Z&quot;,</span><br><span class="line">        &quot;build_snapshot&quot;: false,</span><br><span class="line">        &quot;lucene_version&quot;: &quot;6.6.0&quot;</span><br><span class="line">    &#125;,</span><br><span class="line">    &quot;tagline&quot;: &quot;You Know, for Search&quot;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="相关概念"><a href="#相关概念" class="headerlink" title="相关概念"></a>相关概念</h1><p>在进一步使用 Elasticsearch 之前，让我们先了解几个关键概念。</p><h2 id="在逻辑层面"><a href="#在逻辑层面" class="headerlink" title="在逻辑层面"></a>在逻辑层面</h2><ul><li>Index (索引)：这里的 Index 是名词，一个 Index 就像是传统关系数据库的 - Database，它是 Elasticsearch 用来存储数据的逻辑区域。我们唯一需要做的仅仅是选择一个索引名。这个名字必须是全部小写，不能以下划线开头，不能包含逗号。</li><li>Type (类型)：文档归属于一种 Type，就像是关系数据库中的一个 Table</li><li>Document (文档)：Elasticsearch 使用 JSON 文档来表示一个对象，就像是关系数据库中一个 Table 中的一行数据</li><li>Field (字段)：每个文档包含多个字段，类似关系数据库中一个 Table 的列</li></ul><h2 id="在物理层面"><a href="#在物理层面" class="headerlink" title="在物理层面"></a>在物理层面</h2><ul><li>Node (节点)：node 是一个运行着的 Elasticsearch 实例，一个 node 就是一个单独的 server</li><li>Cluster (集群)：cluster 是多个 node 的集合</li><li>Shard (分片)：数据分片，一个 index 可能会存在于多个 shard</li></ul><h2 id="Relational-DB-和-Elasticsearch的区别"><a href="#Relational-DB-和-Elasticsearch的区别" class="headerlink" title="Relational DB 和 Elasticsearch的区别"></a>Relational DB 和 Elasticsearch的区别</h2><p>在ElasticSearch中，我们常常会听到Index、Type以及Document等概念，那么它们与传统的熟知的关系型数据库中名称的类比如下：</p><table><thead><tr><th style="text-align:left">Mysql</th><th>Elasticsearch</th></tr></thead><tbody><tr><td style="text-align:left">Database（数据库）</td><td>Index（索引）</td></tr><tr><td style="text-align:left">Table（表）</td><td>Type（类型）</td></tr><tr><td style="text-align:left">Row（行）</td><td>Document（文档）</td></tr><tr><td style="text-align:left">Column（列）</td><td>Field（字段）</td></tr><tr><td style="text-align:left">Schema（表设计）</td><td>Mapping（映射）</td></tr><tr><td style="text-align:left">Index（索引）</td><td>Everything Indexed by default（所有字段都被索引）</td></tr><tr><td style="text-align:left">SQL（结构化查询语言）</td><td>Query DSL（查询专用语言）</td></tr></tbody></table><h2 id="其文件目录结构如下"><a href="#其文件目录结构如下" class="headerlink" title="其文件目录结构如下"></a>其文件目录结构如下</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">elasticsearch---这是Elasticsearch解压的目录</span><br><span class="line">　　bin---这里面是ES启动的脚本</span><br><span class="line"></span><br><span class="line">　　conf---elasticsearch.yml为ES的配置文件</span><br><span class="line"></span><br><span class="line">　　data---这里是ES得当前节点的分片的数据，可以直接拷贝到其他的节点进行使用</span><br><span class="line"></span><br><span class="line">　　logs---日志文件</span><br><span class="line"></span><br><span class="line">　　plugins---这里存放一些常用的插件，如果有一切额外的插件，可以放在这里使用。</span><br></pre></td></tr></table></figure><h2 id="HTTP请求链接说明"><a href="#HTTP请求链接说明" class="headerlink" title="HTTP请求链接说明"></a>HTTP请求链接说明</h2><p>一个 Elasticsearch 请求和任何 HTTP 请求一样由若干相同的部件组成：</p><blockquote><p>curl -X<verb> ‘<protocol>://<host>:<port>/<path></path>?&lt;QUERY_STRING&gt;’ -d ‘<body>‘</body></port></host></protocol></verb></p></blockquote><h2 id="被-lt-gt-标记的部件"><a href="#被-lt-gt-标记的部件" class="headerlink" title="被 &lt; &gt; 标记的部件"></a>被 <code>&lt; &gt;</code> 标记的部件</h2><table><thead><tr><th style="text-align:left">参数</th><th>说明</th></tr></thead><tbody><tr><td style="text-align:left">VERB</td><td>适当的 HTTP _方法_ 或 _谓词_ : <code>GET</code>、 <code>POST</code>、 <code>PUT</code>、 <code>HEAD</code> 或者 <code>DELETE</code>。</td></tr><tr><td style="text-align:left">PROTOCOL</td><td><code>http</code> 或者 <code>https</code>（如果你在 Elasticsearch 前面有一个 <code>https</code> 代理）</td></tr><tr><td style="text-align:left">HOST</td><td>Elasticsearch 集群中任意节点的主机名，或者用 +localhost+ 代表本地机器上的节点。</td></tr><tr><td style="text-align:left">PORT</td><td>运行 Elasticsearch HTTP 服务的端口号，默认是 <code>9200</code> 。</td></tr><tr><td style="text-align:left">PATH</td><td>API 的终端路径（例如 <code>_count</code> 将返回集群中文档数量）。Path 可能包含多个组件，例如：<code>_cluster/stats</code> 和 <code>_nodes/stats/jvm</code> 。</td></tr><tr><td style="text-align:left">QUERY_STRING</td><td>任意可选的查询字符串参数 (例如 <code>?pretty</code> 将格式化地输出 JSON 返回值，使其更容易阅读)</td></tr><tr><td style="text-align:left">BODY</td><td>一个 JSON 格式的请求体 (如果请求需要的话)</td></tr></tbody></table><h2 id="解决不能以root身份运行"><a href="#解决不能以root身份运行" class="headerlink" title="解决不能以root身份运行"></a>解决不能以root身份运行</h2><p>在ElasticSearch 2.x版本中，默认是不允许以Root用户身份运行实例，可以使用bin/elasticsearch -Des.insecure.allow.root=true来以Root身份启动集群，此外还可以使用bin/elasticsearch -f -Des.path.conf=/path/to/config/dir参数来读取相关的.yml或者.json配置。</p><p><strong>Restful API</strong></p><p>参考文档：<br><a href="https://juejin.im/entry/57e222528ac24700617b8c78" target="_blank" rel="noopener">https://juejin.im/entry/57e222528ac24700617b8c78</a><br><a href="https://imququ.com/post/elasticsearch.html" target="_blank" rel="noopener">https://imququ.com/post/elasticsearch.html</a><br><a href="http://blog.csdn.net/lvhong84/article/details/23936697" target="_blank" rel="noopener">http://blog.csdn.net/lvhong84/article/details/23936697</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;在安装 Elasticsearch 之前，请确保你的计算机已经安装了 Java。目前 Elasticsearch 的最新版是 5.2，需要安装 Java 8，如果你用的是老版本的 Elasticsearch，如 2.x 版，可用 Java 7，但还是推荐使用 Java 8。
      
    
    </summary>
    
    
      <category term="ElasticSearch" scheme="https://lookphp.github.io/tags/ElasticSearch/"/>
    
  </entry>
  
  <entry>
    <title>使用hexo搭建博客教程</title>
    <link href="https://lookphp.github.io/2018/03/22/%E4%BD%BF%E7%94%A8hexo%E6%90%AD%E5%BB%BA%E5%8D%9A%E5%AE%A2%E6%95%99%E7%A8%8B/"/>
    <id>https://lookphp.github.io/2018/03/22/使用hexo搭建博客教程/</id>
    <published>2018-03-22T15:17:05.000Z</published>
    <updated>2018-03-22T15:31:14.886Z</updated>
    
    <content type="html"><![CDATA[<p>Hexo的安装需要通过npm命令来进行，安装完node.js之后就默认安装了npm包管理工具，而npm的官方仓库位于境外，由于众所周知的原因，我们大陆用户基本是访问不了官方源了，所以推荐大家使用淘宝镜像进行替换。</p><h1 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h1><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new <span class="string">"My New Post"</span></span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/writing.html" target="_blank" rel="noopener">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/server.html" target="_blank" rel="noopener">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/generating.html" target="_blank" rel="noopener">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/deployment.html" target="_blank" rel="noopener">Deployment</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;Hexo的安装需要通过npm命令来进行，安装完node.js之后就默认安装了npm包管理工具，而npm的官方仓库位于境外，由于众所周知的原因，我们大陆用户基本是访问不了官方源了，所以推荐大家使用淘宝镜像进行替换。&lt;/p&gt;
&lt;h1 id=&quot;Quick-Start&quot;&gt;&lt;a hr
      
    
    </summary>
    
    
      <category term="hexo" scheme="https://lookphp.github.io/tags/hexo/"/>
    
      <category term="blog" scheme="https://lookphp.github.io/tags/blog/"/>
    
  </entry>
  
  <entry>
    <title>Hello World</title>
    <link href="https://lookphp.github.io/2018/03/20/hello-world/"/>
    <id>https://lookphp.github.io/2018/03/20/hello-world/</id>
    <published>2018-03-20T15:29:38.066Z</published>
    <updated>2018-03-20T15:29:38.066Z</updated>
    
    <content type="html"><![CDATA[<p>Welcome to <a href="https://hexo.io/" target="_blank" rel="noopener">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/" target="_blank" rel="noopener">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html" target="_blank" rel="noopener">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues" target="_blank" rel="noopener">GitHub</a>.</p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new <span class="string">"My New Post"</span></span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/writing.html" target="_blank" rel="noopener">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/server.html" target="_blank" rel="noopener">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/generating.html" target="_blank" rel="noopener">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/deployment.html" target="_blank" rel="noopener">Deployment</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;Welcome to &lt;a href=&quot;https://hexo.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Hexo&lt;/a&gt;! This is your very first post. Check &lt;a href=&quot;https://hexo.
      
    
    </summary>
    
    
  </entry>
  
</feed>
