1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
<?php //以product核心为例 案例数据如下: /* <doc> <field name="id">112211</field> <field name="productName">口红</field> <field name="brandId">1</field> <field name="brandName">蒂芙尼</field> <field name="categoryName">化妆品</field> <field name="price">111</field> </doc> */ //关键词解释 /* termVectors,termPositions,termOffsets 如果你前端显示需要带高亮和位置的,这几个字段都要设置为true。 sortMissingFirst sortMissingLast 设置成true时没有该field的数据排在有该field的数据之前or之后,而不管请求时的排序规则, 默认是设置成false。 <fieldType name="tint" class="solr.TrieIntField" precisionStep="8" positionIncrementGap="0"/> t打头的都是范围查找 //analyzer 配置分词器 下面例子表示使用空格分词器 使用停词分词器 停词分词器在stopwords.txt中配置 <fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100"> <analyzer> <tokenizer class="solr.WhitespaceTokenizerFactory"/> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> </analyzer> </fieldType> */ //优化 //将所有只用于搜索的,而不需要作为结果的field(特别是一些比较大的field)的stored设置为false //将不需要被用于搜索的,而只是作为结果返回的field的indexed设置为false //删除所有不必要的copyField声明(保留全文本字段) //为了索引字段的最小化和搜索的效率,将所有的全文本字段的indexd都设置成false,然后使用copyField将他们都复制到一个总的text field上,然后对他进行搜索。 //使用尽可能高的Log输出等级,减少日志量。 //配置如下: //修改schema.xml需要重新加载(控制台Core Admin->Reload),重建索引,再不行的话,重启tomcat <?xml version="1.0" encoding="UTF-8" ?> //<!-- 修改name为核心名 --> <schema name="product" version="1.5"> //<!-- _version_必须保留 _root_可删除 --> <field name="_version_" type="long" indexed="true" stored="true"/> <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> //<!-- text_general:单字分词 multiValued:是否是多值(可以理解为是否是数组等)--> <field name="productName" type="text_general" indexed="true" stored="true" required="true" multiValued="false" /> //<!-- omitNorms="true"为忽略规则,如权重等 --> <field name="brandId" type="int" indexed="false" stored="true" omitNorms="true"/> <field name="brandName" type="string" indexed="true" stored="true" required="true" multiValued="false"/> <field name="categoryName" type="text_general" indexed="true" stored="true" required="true" multiValued="true"/> <field name="price" type="double" indexed="false" stored="true" multiValued="false"/> //<!-- 动态声明字段 xxx_i会被声明为int字段 --> <dynamicField name="*_i" type="int" indexed="true" stored="true"/> <uniqueKey>id</uniqueKey> //<!-- 将商品名称、目录名称指定到text 搜索的时候如果用text:xxx就会把商品名称、目录名称中包含xxx的全部匹配出来 --> <copyField source="productName" dest="text"/> <copyField source="categoryName" dest="text"/> //<!-- fieldType开始保持不变 --> //positionIncrementGap属性 配合phrase query(短语搜索时使用,使用较少) //参考:http://ericbao.blog.sohu.com/300612294.html |