0%

正常情况下的全词匹配可以用双引号括住需要检索的关键字,比如: q=name:”keyword”
但是如果某个字段用配置了中文分词器,用双引号括住无法查找到对应记录,只能用分词的结果的一部分做模糊查询,比如要精确查询 “美丽人生” ,用 q=name:”美丽人生” 是无法匹配到的,只能用 q=name:”美丽” ,或者 q=name:”人生” 才能匹配到.
中文分词配置如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<field name="name" type="textComplex" indexed="true" stored="true"/>

...

<fieldType name="textComplex" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex"/>
<filter class="solr.WordDelimiterFilterFactory"
splitOnNumerics="0"
generateWordParts="1"
generateNumberParts="1"
catenateWords="0"
catenateNumbers="0"
catenateAll="0"
preserveOriginal="1"
/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="10"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>

解决的思路就是索引两个字段,一个分词,一个不分词,但是他们都索引了,在查询时,同时查询这两个字段,分词的字段:模糊查,不分词的字段:精确查,这样以来既能保证召全率,也能保证查准率,配置如下:

1
2
3
4
5
6
7
8
<!-- 这个字段用于模糊匹配 -->
<field name="name" type="textComplex" indexed="true" stored="true"/>

<!-- 这个字段用于精确匹配 -->
<field name="exactName" type="exactText" indexed="true" stored="true"/>

<!--保持这两个字段相等 -->
<copyField source="name" dest="exactName"/>

如同作者的写作手记所述:

..

(4)权本位是这个民族悲剧不断循环的宿命之根,但很多人将矛头指向儒家,心中始终愤愤不平。   

(5)中国历史命运的转折是从汉武帝独尊儒术开始。儒学和中国文化从此定型,两千年延续不断。

..

这本书大有为儒学鸣不平之意。

回望高中的时候,语文老师强迫我们背下通篇《论语》,我背下之后,就在早读课上记诵 老、庄。当时仅仅是下意识的更喜欢老、庄,很大程度跟自己的性格有关:不喜与人争。

这本书将命题上升到民族的高度,把儒学放在一个特定的时间点:汉武帝独尊儒术 上来打量,试图得到这样一个结论,儒学并不是权本位的根源,恰恰相反,儒学也是权本位的牺牲品,从真正的圣人之言,成为了当权者操纵思想的工具。

君子谋道不谋食。耕也,馁在其中矣;学也,禄在 其中矣。

出自论语中的这类词句在本书中是被当权者强加到论语中的,并非出自孔子。当权者通过篡改论语达到了操纵思想的目的。

同样的,本书中通过同一时期司马迁和他所著《史记》的命运也印证了这一点。

且不管作者有关儒学的申辩,这里本来有一句话,但是最终还是没敢写出来,俗称,自我审查,自我和谐

  1. 通过homebrew安装solr:

    1
    brew install solr

    安装在/usr/local/Cellar/solr/下对应版本号的目录

  2. 启动solr cloud:

    1
    solr start -e cloud -noprompt

    或者solr单个节点:

    1
    solr start

    启动后通过访问:http://localhost:8983/solr/#/~cloud 可以看到系统拓扑图:
    2016-04-12 at 下午9.20.jpg

  3. 导入数据
    3.1 导入富文本文件

    1
    post -c gettingstarted /usr/local/Cellar/solr/5.5.0/libexec/docs/

    以上命令将导入solr目录下的示例数据文件夹包含的富文本文件.
    导入之后,就可以通过访问solr的搜索界面:http://localhost:8983/solr/#/gettingstarted_shard1_replica2/query 进行搜索:
    2016-04-12 at 下午9.34.jpg
    3.2 通过solr xml格式文件导入数据
    solr xml文件的定义参见:apache wiki
    导入示例文件命令为:

    1
    post -c gettingstarted example/exampledocs/*.xml

    通过访问:http://localhost:8983/solr/gettingstarted/browse 可以看到当前已导入的文件列表,同样可以通过搜索界面进行搜索.
    3.3 通过json格式文件导入

    1
    post -c gettingstarted example/exampledocs/books.json

    3.4 通过csv格式文件导入

    1
    post -c gettingstarted example/exampledocs/books.csv

    3.5 其他导入方式
    通过DIH从数据库导入,使用SolrJ插件通过java等基于jvm的代码导入,使用Admin UI …

  4. 通过关键词进行搜索
    4.1 单个条件搜索
    通过替换搜索界面中q的默认值:*:*为’foudation’或者访问地址:http://localhost:8983/solr/gettingstarted/select?wt=json&indent=true&q=foundation 可以得到搜索结果.
    访问搜索界面需要执行sharding,但是请求搜索结果可以忽略
    可以看到返回的结果几乎包含了所有的记录,因为刚才的搜索包含了所有的字段,通过将q设置为name:foudation可以仅仅搜索name属性中中包含foudation的记录,同理可以试试q设置为cat:software搜索cat属性中包含software的记录.
    4.2 词组搜索
    例如需要搜索CAS latency,在搜索界面中可以直接录入CAS latency,但是如果通过url,需要将空格替换为+.
    2016-04-12 at 下午10.17.jpg
    4.3 组合搜索条件
    需要条件出现使用+,需要条件不出现使用-
    例如:http://localhost:8983/solr/gettingstarted/select?wt=json&indent=true&q=%2Bone+%2Bthree 这个链接搜索包含one但是不包含three的记录
    4.4 更多
    访问apache wiki获取更多有关搜索的细节.
  5. 清理
    到现在我们已经大致接触了solr,要将solr恢复到初始状态,执行以下命令:
    1
    bin/solr stop -all ; rm -Rf example/cloud/