solr入门

第一部分:了解solr

一、solr是什么?
Solr 是一个开源的企业级搜索服务器,底层使用易于扩展和修改的Java 来实现。服务器通信使用标准的HTTP 和XML,所以如果使用Solr 了解Java 技术会有用却不是必须的要求。
二、lucene是什么?

Lucene 是一个基于 Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta 家族中的一个开源项目。也是目前最为流行的基于 Java 开源全文检索工具包。

目前已经有很多应用程序的搜索功能是基于 Lucene ,比如 Eclipse 帮助系统的搜索功能。Lucene 能够为文本类型的数据建立索引,所以你只要把你要索引的数据格式转化的文本格式,Lucene 就能对你的文档进行索引和搜索。

三、Solr VS Lucene

Solr 与Lucene 并不是竞争对立关系,恰恰相反Solr 依存于Lucene ,因为Solr 底层的核心技术是使用Apache Lucene 来实现的,简单的说Solr 是Lucene 的服务器化。需要注意的是Solr 并不是简单的对Lucene 进行封装,它所提供的大部分功能都区别于Lucene 。

第二部分:教程

一、从网站上下载

http://lucene.apache.org/solr/

我找的版本是5.3.1,最新版本是5.5

二、安装与运行

1、安装环境要求:

java的版本大于 1.7(利用java -version查看)

php接口是 >=5.2.11

 

2、启动:

bin/solr start -e cloud -noprompt

默认是8983端口
http://localhost:8983/solr/
快速入门solr002oYysygy70MbNH8XLf1&690
 
图片中各项的具体含义:
快速入门solr
002oYysygy70MbQv8Voee&690
002oYysygy70MbSpB5o1a&690
说明:这里是使用给好的例子,所以是有索引的。
使用 bin/solr start 是看不到索引。
其他命令
bin/solr start -p 8984(指定为8984端口)
bin/solr create -c 指定一个实例
bin/solr create -help 帮助
 
三、建立一个实例:
bin/post -c gettingstarted docs/

    -c gettingstarted:索引的名字(后期获取结果时用到)
    docs/:数据
快速入门solr002oYysygy70MbTPRJm48&690
在界面中可以看到,建立了实例。
并且也是有数据的。
 也是可以通过命令去查看的
http://localhost:8983/solr/admin/cores?action=STATUS
 
四、数据说明:
1、数据类型:索引不同类型的文档
官方文档中说:
Solr can be queried via REST clients, cURL, wget, Chrome POSTMAN, etc., as well as via the native clients available for many programming languages.

可以看出,可以建立不同形式的索引,包括json,xml,以及word

功能:添加,更新,删除等
如xml数据:
<add>
<doc>
  <field name="id">USD</field>
  <field name="name">One Dollar</field>
  <field name="manu">Bank of America</field>
  <field name="manu_id_s">boa</field>
  <field name="cat">currency</field>
  <field name="features">Coins and notes</field>
  <field name="price_c">1,USD</field>
  <field name="inStock">true</field>
</doc>
</add>
conf/schema.xml配置文件中规定好的。
 
五、怎么搜索?
1、界面搜索
http://localhost:8983/solr/#/gettingstarted_shard1_replica1/query
快速入门solr002oYysygy70Mc05TGz83&690
 

2、页面访问:

http://localhost:8983/solr/gettingstarted/select?wt=json&indent=true&q=foundation
 
六、思考:通过curl就可以获取,缺点就是不太安全吧?

如5.3上管理用户界面没有用户限制,所以任何人都可以访问管理员的用户界面将可以做任何事情与您的系统。

解决方案:基本认证和授权插件/设置防火墙
 
 
以上就是一个简单的索引的建立和搜索功能,有问题欢迎留言。

关于定位的一些参考

整  理:朱 兵
时  间:2016-02-05
说  明: 定位的相关知识

摘要:关于定位,分为GPS定位和网络定位2种。GPS定位,精度较高,可达到10米,但室内不可用,且超级费电。网络定位,分为wifi定位和基站定位,都是通过获取wifi或者基站信息,然后查询对应的wifi或者基站位置数据库,得到的定位地点。定位数据库可以不断完善不断补充,所以,越定位越准确。

一、常见的定位:

GPS全球定位。

常见的GPS定位的原理可以简单这样理解:由24颗工作卫星组成,使得在全球任何地方、任何时间都可观测到4颗以上的卫星, 测量出已知位置的卫星到用户接收机之间的距离,然后综合多颗卫星的数据就可知道接收机的具体位置。

在露天环境下效果较好,获取位置信息非常精确。适合移动设备。 

缺点:在地铁等位置效果较差

IP地址定位。

适用于接入互联网的设备,通过浏览器是将位置信息发送给 ISP 服务商来解析,其IP 地址与服务商所在位置有关,可能与用户所在位置不同,所以这种方式的解析容易出现偏差。 

另外,由于国内大部分的省都是以省级为单位划分基站对外访问 IP ,也就是说,同样一个出口 IP,后面的对应用户
可能是跨多个城市的。也有一部分省是按照市一级为单位划分的,但是位置偏远。
备注:IP定位很方便,但是数据不准,需要及时更新,有很多商业化的服务。

WiFi定位。

设备只要侦听一下附近都有哪些热点,检测一下每个热点的信号强弱,然后把这些信息发送给网络上的服务端。服务器根据这些信息,查询每个热点在数据库里记录的坐标,然后进行运算,就能知道客户端的具体位置了。一次成功的定位需要两个先决条件:客户端能上网 ,侦听到的热点的坐标在数据库里有。

优点:这种方式与GPS效果同样精确,适用于室内环境的移动设备。

缺点:

  • 你的这个wifi信号,如果在数据库中没有被记录在案,那就没法定位了。比如,如果你买了个新的无线路由器,靠它肯定是没法帮助你的移动设备定位的。
  • 数据更新有延迟,WIFI覆盖并不大,局限
    原理说明:当你的移动设备需要使用wifi定位的时候,它会搜索周围的wifi信号,同时在数据库中搜索,得到地理位置的数据,加上定位提供商收集的海量数据,能够构建出信号的“指纹”,比基站定位更精准。

④基站定位

我们把手机基站的覆盖范围想像成一个个以基站为圆心的圆,需要定位时,手机就向周边多座基站发送测量信号,并计算这些测量信号到达基站所需要的时间,推算出手机距离基站的直线距离,再经过数学运算,手机位置坐标就可由3个基站圆的交点来确定。

优点:LBS定位的优势是方便、成本低,因为它是通过手机进行定位的。理论上说,只要计算三个基站的信号差异,就可以判断出手机所在的位置,而且用户所持终端只需一部手机即可。因此,只要用户手机有信号,就可以随时进行位置定位,而不受天气、高楼、位置等影响。

缺点:定位精度随所处位置基站数不同会有变化。

百度地图等在web开发时并不提供相关api

二、测试结果:

初步得到的结果:GPS>WiFi/基站>IP

1、GPS和WIFI相对测试的结果较好。
2、局限性:WIFI效果较好,但是局限性很大。基站定位在web开发时比较麻烦
3、目前比较好的方式,就是读取GPS的相关信息(比如经纬度等等),再做进一步操作。
4、在精准度要求比较高的情况下,并不推荐使用ip定位。ip定位好处是:并不需要用户授权,方便。

三、业务说明:

以百度地图为例

1、APP开发的话
百度定位sdk,综合了wifi定位、基站定位

2、web开发的话

浏览器定位

浏览器定位插件,封装了标准HTML5定位,并且包含纠偏模块。

html5定位:拿到的是GPS的数据,定位准确

备注:获取经纬度数据,想获得地址,需要纠偏,再使用接口获得。

鉴于该特性可能侵犯用户的隐私,除非用户同意,否则用户位置信息是不可用的。

Internet Explorer 9、Firefox、Chrome、Safari 以及 Opera 支持地理定位。

注释:对于拥有 GPS 的设备,比如 iPhone,地理定位更加精确。

更多可参考geekman的文章:http://blog.geekman.vip/archives/446

另外,浏览器定位插件也是混合定位,获取了wifi、基站信息用以定位,对于拥有 GPS 的设备,比如 iPhone,由于获得GPS信息,使得地理定位更加精确。

★浏览器定位,最好使用在手机浏览器上,会更加准确,也更加符合使用场景。PC浏览器上,建议使用IP定位。

通过网络获取IP信息,然后查询IP数据库,获取相应的地址信息。

IP数据库也是可以完善补充,越来越丰富的,所以也是越使用越准确的。

但如果IP有跳转,有篡改等,那么IP定位就会不准确了。

demo:http://developer.baidu.com/map/jsdemo.htm#i8_2

③web接口
嫌开发不方便,可以直接调用web接口,体验更快,缺点是次数限制。
育儿网对一些接口进行了封装(100w次)
根据ip获取地理位置
根据经纬度获取地理位置(百度接口)

具体api地址在:http://api.xinfotek.com/apidoc/doc/

关于JSAPI/webAPI的小小说明

1、js是浏览器端,而web是服务端。

2、在使用上Web更简单,若只想使用服务,直接通过调用接口获取结果的话,并且需求量并不大的 时候,建议使用web。(百度js调用次数不限)

3、想展示地图,或者超过接口限制,比较复杂的web开发,想要的功能并没有提供相应的接口,会需要用到js。

Tip:使用之前需要申请秘钥.

秘钥分为浏览器端,服务端,

为了安全性可设置白名单:
浏览器端是设置域名:如*.ci123.com,只能在该域名下访问

服务端是设置ip白名单,不限制的话 0.0.0.0/0
3、在微信中使用

引用微信js即可使用

给的接口只有两类,一类是用内置浏览器(使用并不多),一类是得到想要的配置

示例一:使用微信内置地图查看位置接口
wx.openLocation({
latitude: 0, // 纬度,浮点数,范围为90 ~ -90
longitude: 0, // 经度,浮点数,范围为180 ~ -180。
name: '', // 位置名
address: '', // 地址详情说明
scale: 1, // 地图缩放级别,整形值,范围从1~28。默认为最大
infoUrl: '' // 在查看位置界面底部显示的超链接,可点击跳转

});
示例二:获取地理位置接口
wx.getLocation({
    type: 'wgs84', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
    success: function (res) {
        var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
        var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
        var speed = res.speed; // 速度,以米/每秒计
        var accuracy = res.accuracy; // 位置精度
    }
});
 
四、其他说明
①特殊说明:
1、通过百度jsapi测试结果看,通过ip定位城市效果也会存在比较大的误差,更别提精确定位。
但是只要数据库足够丰富,定位结果会准确的多,但是成本会特别高。
2、对于GPS坐标转换成使用百度api需要转换百度坐标(纠偏)
②自己写的参考demo
1、js版(利用html5定位,再调用百度api,调用次数不限)
好处:去除了地图展示等一些功能,直接显示位置。
演示效果
QQ图片20160205154740
2、web请求,这个比较简单,直接根据经纬度调用接口。
好处:少一次调用
③参考资料/网站:
3、百度开发平台:http://lbsyun.baidu.com/

 

 

linux上安装node.js

说明:

使用CentOS系统,进行node.js安装,node.js版本- v0.12.0。

1,先下载node.js:

# wget http://npm.taobao.org/mirrors/node/v0.12.0/node-v0.12.0.tar.gz

//用的淘宝镜像,更快

2,解压文件

# tar xvf node-v0.12.0.tar.gz

 

3,进入解压目录

# cd node-v0.12.0

 

4,检查所需要配置

# ./configure

 

5,如出现以下错误,安装gcc-c++ (安装较新的版本可能会出现)

注意:线上服务器请勿随意升级,建议尝试其他版本的 node.js!!!!!

出现错误提示:

WARNING: C++ compiler too old, need g++ 4.8 or clang++ 3.4 (CXX=g++)

# yum install gcc-c++

如无,请跳过

 

6,进行安装(时间比较长):

# make install

 

7,检查是否成功安装,输入命令:

# node -v

 

如果安装成功会输出相应版本号,如:

v0.12.0

 

8,现在可以创建一个test.js文件进行测试,文件内容为:console.log('Hello World.');

输入命令:

# node test.js

输出:

Hello World.

 

关于include_path使用说明

整    理:朱 兵
时    间:2015-11-30
说    明:关于include_path使用说明
 一、在什么地方遇到?
    现象:在文件中遇到require_once("DB.php"),发现在当前目录下并没有该文件。
    原因:主要是用到了include_path,遇到此问题,在php配置中查找include_path的路径即可找到相应的文件。
    当用到函数include(),require()函数来寻找文件时候.在不设置include_path的情况下,这些函数打开文件时候默认的是以web根目录去寻找.当设置include_path以后,这些php函数就会先在指定的include_path目录下面去搜索寻找。我们可以在include_path目录下找到相应的文件。
 二、include_path的设置
1、第一种方法:
linux 下
修改php.ini文件中的include_path项。

include_path=".:/opt/ci123/php-5.3.27/share/pear"
windows下
include_path=".;c:\php\includes"
在 Windows 中,用分号分隔目录。在任何其它系统中用冒号分隔目录。

编写程序时可以用常量 PATH_SEPARATOR 代替

2、第二个方法:
使用ini_set方法。

ini_set('include_path', '/usr/lib/pear');

 三、运行时包含的顺序

1.如果为绝对路径,则直接包含, 并结束(找不到直接退出).

2.如果是是相对路径((形如./file, ../dir/file),则跳过include_path的作用逻辑, 直接解析相对路径(找不到直接退出)

3.都不是以上两种情况

会根据include_path,和当前执行文件的path组成一个待选的目录列表

注意点:
1、如果在指定的目录下找不到所要求包含的文件,而在当前页面目录下正好存在这个名称的文件时,则默认引入当前目录下的该文件。

2、当指定了多个目录为 include_path ,而所要求包含的文件在这几个目录都有相同名称的文件存在时,php选择使用设定 include_path 时排位居前的目录下的文件。

 四、php手册中的相关函数

   - set_include_path — 设置 include_path 配置选项
   - ini_set() - 为一个配置选项设置值
   - get_include_path() - 获取当前的 include_path 配置选项
   - restore_include_path() - 还原 include_path 配置选项的值
 五、扩展阅读