正常数据结构一个是需要考虑中文分词,二个是考虑是否索引,是否分词,是否存储等等。
下面的示范用到了三种类型的数据:
一:字段需要分词、需要索引、需要存储,如:网页中的标题、内容等字段。
二:字段需要索引,但不需要分词,需要存储,如:网页的发布时间等内容。
三:字段不需要索引,不需要分词,但需要存储,如:引用的图片位置。
不存在不需要索引、也不需要分词,也不需要存储的字段,因为这样的字段在Lucene中无意义。
示范配置:
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
| <?xml version="1.0" ?>
<schema name="news" version="1.1">
<fields>
<!--下面三个字段需要分词,索引,存储 -->
<!-- 发布者 -->
<field name="webUser" type="text_mm4j" indexed="true" stored="true"/>
<!-- 标题 -->
<field name="webTitle" type="text_mm4j" indexed="true" stored="true" termVectors="true" termPositions="true" termOffsets="true"/>
<!-- 内容 -->
<field name="webContent" type="text_mm4j" indexed="true" stored="true" termVectors="true" termPositions="true" termOffsets="true"/>
<!--下面需要索引,不分词,需要存储 -->
<!-- 来源ID -->
<field name="webId" type="int" indexed="true" stored="true"/>
<!-- 主键ObjectID -->
<field name="objectId" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<!-- 论坛类型(txt/pic/video) -->
<field name="webType" type="string" indexed="true" stored="true"/>
<!-- 发布时间 -->
<field name="webTime" type="date" indexed="true" stored="true"/>
<!--下面信息仅存储 -->
<!-- 网站描述 -->
<field name="webCommit" type="string" indexed="false" stored="true"/>
<!-- 网址 -->
<field name="webUrl" type="string" indexed="false" stored="true"/>
<!-- 生成网页地址 -->
<field name="webHtml" type="string" indexed="false" stored="true"/>
<!-- 视频 -->
<field name="webVideo" type="string" indexed="false" stored="true"/>
<!-- 图片 -->
<field name="webImage" type="string" indexed="false" stored="true" multiValued="true"/>
<!--下面信息为区别数据类型,索引,不分词,存储 -->
<!-- 索引类型,bbs/news/blog -->
<field name="indexType" type="string" indexed="true" stored="true"/>
<!-- 拷贝字段 ,索引不存储 -->
<field name="text" type="text_mm4j" indexed="true" stored="false" multiValued="true"/>
<field name="_version_" type="long" indexed="true" stored="true"/>
</fields>
<copyField source="webUser" dest="text"/>
<copyField source="webTitle" dest="text"/>
<copyField source="webContent" dest="text"/>
<uniqueKey>objectId</uniqueKey>
<defaultSearchField>text</defaultSearchField>
<solrQueryParser defaultOperator="OR"/>
<types>
<fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>
<fieldtype name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
<fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<!-- in this example, we will only use synonyms at query time
<filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
-->
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
<analyzer type="query" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
<fieldType name="text_mm4j" class="solr.TextField" >
<analyzer type="index">
<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="simple" dicPath="C:/solr/mm4jdic"/>
<!--
<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="simple" dicPath="/usr/local/solr/mm4jdic"/>
-->
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
</analyzer>
<analyzer type="query">
<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="simple" dicPath="C:/solr/mm4jdic"/>
<!--
<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="simple" dicPath="/usr/local/solr/mm4jdic"/>
-->
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
</analyzer>
</fieldType>
</types>
</schema> |
补充说明:
termVectors=”true” termPositions=”true” termOffsets=”true”
这几项参数是在项目中使用到FastVectorHighlighter时需要配置的,如果没有使用FastVectorHighlighter的话,可以忽略这些参数。
multiValued=”true”
此项参数为是否允许多值,主键不允许多值。但图片等允许多值,另拷贝字段(如:text字段)默认也是多值。
type=”string”
string类型的字段默认不分词,当作整体来看。
type=”text_mm4j”
text_mm4j类型的即是中文分词组件,参考types下面关于name=”text_mm4j”的具体配置。本项目中标题、内容等字段需要使用此类型。