手机号不用了怎么找回微信密码忘了怎么登录

Java Client调用ElasticSearch做全文搜索代码示例 -
- ITeye博客
博客分类:
目前在做基于ElasticSearch的搜索实现,采用ElasticSearch提供的Java API实现,用TransportClient连接到ES的Cluster。
根据经验,一个搜索请求应该走这样的流程:
Analyzer分析Query Term
根据Analyzer的结果构建TermQuery
发送Query请求给ES
处理返回结果
想找一段Sample Code,可是一直没找到ES里合适的Analyzer类,很奇怪为什么直接发JSON请求很简单的事,Java处理起来这么复杂(用JSON请求见:)。
静态在StackOverFlow的一个问题里无意看到了这个类:QueryStringQueryBuilder,一切问题迎刃而解了
1 创建客户端
Settings settings = ImmutableSettings.settingsBuilder()
.put("client.transport.sniff", true)
.put("client", true)
.put("data",false)
.put("clusterName","elasticsearch")
client = new TransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress(hostName, 9300));
2 创建StringQuery对象:
QueryStringQueryBuilder = new QueryStringQueryBuilder(parameters.getQueryTerm());
queryStringBuilder.useDisMax(true);
queryStringBuilder.field("title",160);
queryStringBuilder.field("desc",1);
3 构建SearchRequest
SearchRequestBuilder builder= client.prepareSearch("indexName")
.setTypes("collectionName")
.setSearchType(SearchType.DEFAULT)
.setFrom(parameters.getStart())
.setSize(parameters.getCount());
builder.setQuery(queryStringBuilder);
这样,一个基本ElasticSearch请求就构建成功了。
Query 还是 Filter
以前一直弄不清楚为什么Filter也干一些Query可以做的事情,比如查询的附件条件是分类值为”1“,用TermQuery可是实现,用TermFilter也可以实现,为什么有重复的功能。
根据这里(),可以看出,Filter最大的好处是可以实现缓存,并且不需要计算得分。
完善后的搜索
根据上面的结论,重新把搜索条件里的其他限定条件用Filter实现,代替掉原来的Query实现:
FilterBuilder categoryFilterBuilder = FilterBuilders.termFilter("categoryId", parameters.getCategoryId());
String[] ids = new String[parameters.getTypeIds().size()];
parameters.getTypeIds().toArray(ids);
FilterBuilder inFilter = FilterBuilders.inFilter("typeId", ids);
builder.setFilter(filterBuilder);
最后执行搜索:
SearchResponse response = builder.execute().actionGet();
浏览 10988
SearchRequestBuilder builder= client.prepareSearch("indexName")& &&&&&&&&&&&&&&& .setTypes("collectionName")& &&&&&&&&&&&&&&& .setSearchType(SearchType.DEFAULT)& &&&&&&&&&&&&&&& .setFrom(parameters.getStart())& &&&&&&&&&&&&&&& .setSize(parameters.getCount()); 其中的indexName和collectionName是什么?随便定义的吗?如果是在哪定义的?谢谢相当于数据库表和表明,是在创建mapping的时候定义的。
shuminghuang
浏览: 29972 次
来自: 上海
朋友你好,我现在的问题是,已经有两个了,一个用于IK,一个用于 ...
&div class=&quote_title ...
SearchRequestBuilder builder= c ...
重建索引的没有必要来回倒腾吧?可以使用aliases来做索引映 ...
parameters是我自己定义的一个类,用来保存外部传进来的 ...标签:至少1个,最多5个
query与filter的合并
将filter的api列为deprecated,然后合并到query里头。之后查询的context就分为query的context和filter的context。凡是不是filter的context就走query的context。filter的话,其结果不参与score计算,而且会缓存,可能相对快一些。
判断是否属于filter context
the constant_score query
the must_not and (newly added) filter parameter in the bool query
the filter and filters parameters in the function_score query
any API called filter, such as the post_filter search parameter, or in aggregations or index aliases
deprecated的方式
"query": {
"filtered": {
"filter": {
"year": 1961
合并后的方式
"query": {
"filter": {
"status": "active"
bool的话,这种方式出来的score为0,如果加上个match_all的话,则score为1
"query": {
"match_all": {}
"filter": {
"status": "active"
constant_score方式
"query": {
"constant_score": {
"filter": {
"status": "active"
constant_score的方式,默认score为1
match和term query的区别
matchQuery的机制是:先检查字段类型是否是analyzed,如果是,则先分词,再去去匹配token;如果不是,则直接去匹配token。
termQuery的机制是:直接去匹配token。
对于value中带-的特殊处理
"query": {
"filter": {
"status": "demo-active"
value带了-,则默认会被切词,导致搜索结果不准确。解决办法之一就是在字段那里加个.raw
"query": {
"filter": {
"status.raw": "demo-active"
关于合并后的filter在java api中的使用
使用json最直接,省得再用java的api翻译一遍
String queryJson = "{\n" +
\"query\": {\n" +
\"constant_score\": {\n" +
\"filter\": {\n" +
\"term\": {\n" +
\"status.raw\": \"demo-active\"\n" +
QueryBuilders.wrapperQuery(queryJson)
[在elasticsearch里如何高效的使用filter [性能优化必看]](
0 收藏&&|&&0
你可能感兴趣的文章
6 收藏,2.2k
5 收藏,1.1k
本作品采用 署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可
分享到微博?
你好!看起来你挺喜欢这个内容,但是你还没有注册帐号。 当你创建了帐号,我们能准确地追踪你关注的问题,在有新答案或内容的时候收到网页和邮件通知。还能直接向作者咨询更多细节。如果上面的内容有帮助,记得点赞 (????)? 表示感谢。
明天提醒我
我要该,理由是:
扫扫下载 App使用Elasticsearch组件实现对word、pdf、excel、ppt等的文本内容进行全文检索。
组网信息及描述
部署完成DataEngine大数据平台,然后在2个节点上添加Elasticsearch服务组件形成Elasticsearch集群。
elasticsearch-mapper-attachments-3.1.0&& 全文检索插件word、pdf、excel、ppt(兼容es2.10)
2、在每个ES节点上安装插件:上传插件到该目录,然后在目录下解压插件,最后重启ES服务
[root@node4]cd /usr/share/elasticsearch/plugins
[root@node4 plugins]# ls
elasticsearch-analysis-ik-1.6.1& head& elasticsearch-mapper-attachments-3.1.0.zip
[root@node4 plugins]#unzip elasticsearch-mapper-attachments-3.1.0.zip -d ./elasticsearch-mapper
3、打开ES界面,在复合查询中输入如下配置:(建立索引)
点击提交请求后返还为true即创建成功。
内容输入如下:
& &mappings&: {
&&& &parseword&: {
&&&&& &properties&: {
&&&&&&& &parse_file&: {
&&&&&&&&& &type&: &attachment&,
&&&&&&&&& &fields&: {
&&&&&&&&&&& &content&: {
&&&&&&&&&&&&& &type&: &string&,
&&&&&&&&&&&&& &term_vector&: &with_positions_offsets&,
&&&&&&&&&&&&& &analyzer&: &ik_smart&,
&&&&&&&&&&&&& &store&: true
&&&&&&&&&&& },
&&&&&&&&&&& &content_type&: {
&&&&&&&&&&&&& &type&: &string&,
&&&&&&&&&&&&& &store&: true
&&&&&&&&&&& },
&&&&&&&&&&& &name&: {
&&&&&&&&&&&&& &type&: &string&,
&&&&&&&&&&&&& &store&: true
&&&&&&&&&&& }
&&&&&&&&& }
&&& &parsepdf&: {
&&&&& &properties&: {
&&&&&&& &parse_file&: {
&&&&&&&&& &type&: &attachment&,
&&&&&&&&& &fields&: {
&&&&&&&&&&& &content&: {
&&&&&&&&&&&&& &type&: &string&,
&&&&&&&&&&&&& &term_vector&: &with_positions_offsets&,
&&&&&&&&&&&&& &analyzer&: &ik_smart&,
&&&&&&&&&&&&& &store&: true
&&&&&&&&&&& },
&&&&&&&&&&& &content_type&: {
&&&&&&&&&&&&& &type&: &string&,
&&&&&&&&&&&&& &store&: true
&&&&&&&&&&& },
&&&&&&&&&&& &name&: {
&&&&&&&&&&&&& &type&: &string&,
&&&&&&&&&&&&& &store&: true
&&&&&&&&&&& }
&&&&&&&&& }
&&& &parseexcel&: {
&&&&& &properties&: {
&&&&&&& &parse_file&: {
&&&&&&&&& &type&: &attachment&,
&&&&&&&&& &fields&: {
&&&&&&&&&&& &content&: {
&&&&&&&&&&&&& &type&: &string&,
&&&&&&&&&&&&& &term_vector&: &with_positions_offsets&,
&&&&&&&&&&&&& &analyzer&: &ik_smart&,
&&&&&&&&&&&&& &store&: true
&&&&&&&&&&& },
&&&&&&&&&&& &content_type&: {
&&&&&&&&&&&&& &type&: &string&,
&&&&&&&&&&&&& &store&: true
&&&&&&&&&&& },
&&&&&&&&&&& &name&: {
&&&&&&&&&&&&& &type&: &string&,
&& &&&&&&&&&&&&store&: true
&&&&&&&&&&& }
&&&&&&&&& }
&&& &parsepowerpoint&: {
&&&&& &properties&: {
&&&&&&& &parse_file&: {
&&&&&&&&& &type&: &attachment&,
&&&&&&&&& &fields&: {
&&&&&&&&&&& &content&: {
&&&&&&&&&&&&& &type&: &string&,
&&&&&&&&&&&&& &term_vector&: &with_positions_offsets&,
&&&&&&&&&&&&& &analyzer&: &ik_smart&,
&&&&&&&&&&&&& &store&: true
&&&&&&&&&&& },
&&&&&&&&&&& &content_type&: {
&&&&&&&&&&&&& &type&: &string&,
&&&&&&&&&&&&& &store&: true
&&&&&&&&&&& },
&&&&&&&&&&& &name&: {
&&&&&&&&&&&&& &type&: &string&,
&&&&&&&&&&&&& &store&: true
&&&&&&&&&&& }
&&&&&&&&& }
4、指定文件上传目录:
[root@node4 files]# ll
drwxr-xr-x 2 root root& 4096 Jun& 2 11:37 filetoup
-rw-r--r-- 1 root root 89557 Jun& 2 11:37 json.file
-rwxr-xr-x 1 root root&& 374 Jun& 2 10:42 upfile.sh
-rwxr-xr-x 1 root root&& 374 Jun& 2 11:37 upfile-test.sh
[root@node4 files]# pwd
/opt/files
5、编写上传脚本,并给与脚本可执行权限chmod 777 upfile.sh
vi upfile.sh
file_path='/opt/files/filetoup/云计算重大工程项目奖励评选.docx'
file=$(base64 $file_path)
json=&{\&parse_file\&: {\&_content_type\& : \&application/docx\&,\&_name\& : \&云计算重大工程项目奖励评选.docx\&,\&_content\& : \&$file\&}}&
echo &$json&& json.file
curl -X POST &http://172.168.1.179:9200/smartsegmentation/parseword& -d @json.file
6、上传文件
Xshell上传文件即可,注意下面的配置:
使用utf-8编码,中文才能正常显示
7、Es上查询,获取结果
& &fields&: [
&&& &parse_file.content_type&,
&&& &parse_file.name&,
&&& &parse_file.content&
& &query&: {
&&& &match&: {
&&&&& &parse_file.content&: &云计算&
& &highlight&: {
&&& &fields&: {
&&&&& &parse_file.content&: {}
还可输 200 字
0 个赞 | 101 次点击
0 个赞 | 95 次点击
4 个赞 | 23 次点击
0 个赞 | 19 次点击
0 个赞 | 92 次点击
4 个赞 | 29 次点击
20 个赞 | 1523 次点击
9 个赞 | 623 次点击
4 个赞 | 72 次点击
3 个赞 | 69 次点击
近期专家排名
最近发表 28 篇文章
最近发表 20 篇文章
最近发表 20 篇文章
45 个赞 | 7166 次点击
39 个赞 | 6773 次点击
42 个赞 | 5353 次点击
42 个赞 | 4959 次点击
38 个赞 | 4435 次点击

我要回帖

更多关于 微信换了手机,忘记密码 的文章

 

随机推荐