1文档和域的理解
1.1:域相当于数据库中的表的字段,一条sku数据,我们称为 一个Document ,当中的字段 我们称为 域(field)
2域的配置位置
2.1:域的配置,其实就是配置到具体的哪个索引库,因为库和库的数据可能是不一样的
solr_home/collection1(solrCore,我自己搭建的时候起名字是collection)/conf/managed-schema(低版本就是schema.xml)
(自己创建的solrHome)/(solrCore)/conf/managed-schema(低版本就是schema.xml)
3配置讲解
域的常用属性讲解:
field:
name | 指定域的名称 |
type | 指定域的类型 ,一定是配置文件有的(fieldType类型字段)并且看好它所引用具体属性,如String类型标示字段值将会被原样存储,不分词,不改变 |
indexed | 1:是否建立索引,在搜索的时候可以用它来查询或排序,索引的字段将会建立倒排表 例如:价格,商品名称,都是需要我们去搜索的, 商品的图片(url),单是需要我们存储,因为图片也是需要被展示的, 但是却不需要我们搜索。 2:只要想通过该字段删除数据,都必须加indexed="true",否则删除不了 |
stored | 是否存储,一个字段是否被存储,取决于你是否想在Solr的查询结果中得到它 ,复制域不需要存储的。 |
required | 是否必须,主键是必须的,类似于数据库的主键,无值会报错,添加不成功。 |
multiValued | 是否多值, 默认:fasle 场景-->复制域: 例如 :京东搜索,只有一个搜索框,但是却是要搜索,很多域. 一个属性存在多值:name:["小明","小红"] |
termVectors="true" termPositions="true" termOffsets="true" | FastVectorHighlighter高亮显示时用的上,场景:索引大文件, Highlighter则不需要,场景:不适用于大文档 |
域类型(不同版本solr类型不一样,注意查看配置文件中已有的) fieldType->type:
solr不支持BigDecimal类型,请看下面属性
string | 1字符串类型,2 不会分词,是什么数据就是什么数据 |
boolean | 布尔 |
pint/int (具体看版本) | int |
pfloat/float(具体看版本) | float |
plong/long(具体看版本) | long |
pdouble/double(具体看版本) | double |
pints/ints(具体看版本) | 具体属性看配置文件,用途暂时没发现 |
binary | 二进制数据。 |
pdate | 日期字段 |
location/location_rpt | "纬度,经度"/"纬度 经度" |
配置域注意事项:
- 配置文件自带一些配置好的域(id,sku,name...),id默认配置required="true" 并且配置了<uniqueKey>id</uniqueKey>
- 配置type不能瞎写,一定是配置文件里面有的 fieldType类型
我们创建的域类型(type),不是我们随意写的,一定是这个配置文件存在的类型。
<!-- ik分词器/字典域 -->
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<!-- <analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory" useSmart="true" conf="ik.conf"/>
</analyzer> -->
</fieldType>
<!-- 普通域 -->
<!-- 京东为例 sku也是能搜索到的 如果下架还要通过主键删除,必须 indexed="true" -->
<!-- type="plong" 要看版本的 -->
<field name="item_sku" type="plong" indexed="true" stored="true"/>
<!-- 商品名称 商品名称+属性 荣耀 HONOR 荣耀X30全网通5G手机12GB+256GB 晨曦金 -->
<field name="item_title" type="text_ik" indexed="true" stored="true"/>
<!-- 商品价格 -->
<field name="item_price" type="pdouble" indexed="true" stored="true"/>
<!-- 商品图片url -->
<field name="item_image" type="string" indexed="false" stored="true"/>
<!-- 商品分类 -->
<field name="item_category" type="string" indexed="true" stored="true"/>
<!-- 店铺名称 -->
<field name="item_seller" type="text_ik" indexed="true" stored="true" termVectors="true" termPositions="true" termOffsets="true" />
<!-- 品牌 -->
<field name="item_brand" type="string" indexed="true" stored="true"/>
<!-- indexed="true" 有可能通过spu删除数据 -->
<field name="item_spu" type="plong" indexed="true" stored="true"/>
<field name="item_delete" type="boolean" indexed="true" stored="true" />
<field name="item_show" type="boolean" indexed="true" stored="true" />
<!-- 复制域:搜索框只有一个,但是搜索的东西可以是 品牌,价格,商品名称等等 说白了以后我们只搜索复制域-->
<field name="item_keyword" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<copyField source="item_title" dest="item_keyword"/>
<copyField source="item_category" dest="item_keyword"/>
<copyField source="item_seller" dest="item_keyword"/>
<copyField source="item_brand" dest="item_keyword"/>
<!-- 动态域 -->
<dynamicField name="item_spec_*" type="string" indexed="true" stored="true"/>
动态域场景:一件商品可以有不同的规格[尺寸,颜色等等]