• 关于

    全文本搜索

    的搜索结果

问题

dtsearch的全文本搜索很多词都搜索不到

一直以为dtsearch的全文本搜索功能很强大,直到最近发现它居然忽略了许多关键词.悲哀. 如果想通过关键字找电脑中某篇文章,怎么办?...
quintus 2019-12-01 21:07:20 5339 浏览量 回答数 2

问题

全文搜索引擎的比较-Lucene,Sphinx,Postgresql,MySQL?

我正在建立Django网站,并且正在寻找搜索引擎。 一些候选人: Lucene / Lucene与指南针/ Solr 狮身人面像 PostgreSQL内置全文本搜索 MySQl内置全文本搜索 选择标准...
保持可爱mmm 2020-05-10 20:03:45 0 浏览量 回答数 1

问题

SQL Server全文本搜索:具有MSSEARCH等待类型的挂起进程

我们有一台运行大量数据库的SQL Server 2005 SP2计算机,所有数据库都包含全文目录。每当我们尝试删除这些数据库之一或重建全文索引时,删除或重建过程都会无限期地挂起MSSEARCH等待类型。无法终止该...
心有灵_夕 2019-12-26 22:18:51 0 浏览量 回答数 1

阿里云爆款特惠专场,精选爆款产品低至0.95折!

爆款ECS云服务器8.1元/月起,云数据库低至1.5折,限时抢购!

回答

使用索引是数据库性能优化的必备技能之一。在MySQL数据库中,有四种索引:聚集索引(主键索引)、普通索引、唯一索引以及我们这里将要介绍的全文索引(FULLTEXT INDEX)。 全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。它能够利用「分词技术「等多种算法智能分析出文本文字中关键字词的频率及重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。在这里,我们就不追根究底其底层实现原理了,现在我们来看看在MySQL中如何创建并使用全文索引。 在MySQL中,创建全文索引相对比较简单。例如,我们有一个文章表(article),其中有主键ID(id)、文章标题(title)、文章内容(content)三个字段。现在我们希望能够在title和content两个列上创建全文索引,article表及全文索引的创建SQL语句如下: --创建article表 CREATE TABLE article ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, title VARCHAR(200), content TEXT, FULLTEXT (title, content) --在title和content列上创建全文索引 ); 上面就是在创建表的同时建立全文索引的SQL示例。此外,如果我们想要给已经存在的表的指定字段创建全文索引,同样以article表为例,我们可以使用如下SQL语句进行创建: --给现有的article表的title和content字段创建全文索引 --索引名称为fulltext_article ALTER TABLE article ADD FULLTEXT INDEX fulltext_article (title, content) 在MySQL中创建全文索引之后,现在就该了解如何使用了。众所周知,在数据库中进行模糊查询是使用LIKE关键字进行查询,例如: SELECT * FROM article WHERE content LIKE '%查询字符串%' 那么,我们使用全文索引也是这样用的吗?当然不是,我们必须使用特有的语法才能使用全文索引进行查询。例如,我们想要在article表的title和content列中全文检索指定的查询字符串,可以如下编写SQL语句: SELECT * FROM article WHERE MATCH(title, content) AGAINST('查询字符串') 强烈注意:MySQL自带的全文索引只能用于数据库引擎为MyISAM的数据表,如果是其他数据引擎,则全文索引不会生效。此外,MySQL自带的全文索引只能对英文进行全文检索,目前无法对中文进行全文检索。如果需要对包含中文在内的文本数据进行全文检索,我们需要采用Sphinx(斯芬克斯)/Coreseek技术来处理中文。本站将会在后续文章中对Sphinx以及Coreseek进行介绍。 备注1:目前,使用MySQL自带的全文索引时,如果查询字符串的长度过短将无法得到期望的搜索结果。MySQL全文索引所能找到的词的默认最小长度为4个字符。另外,如果查询的字符串包含停止词,那么该停止词将会被忽略。 备注2:如果可能,请尽量先创建表并插入所有数据后再创建全文索引,而不要在创建表时就直接创建全文索引,因为前者比后者的全文索引效率要高。 “答案来源于网络,供您参考” 希望以上信息可以帮到您!
牧明 2019-12-02 02:16:37 0 浏览量 回答数 0

问题

使用InnoDB进行全文搜索

我正在开发一个高容量的Web应用程序,其中的一部分是讨论帖子的MySQL数据库,该数据库需要平稳地增长到2000万+行。 我本来打算对表使用MyISAM(用于内置的全文本搜索功能ÿ...
保持可爱mmm 2020-05-11 17:04:00 0 浏览量 回答数 1

问题

如何使领先的通配符全文本搜索在SQL Server中起作用?

注意:我正在使用SQL的全文本搜索功能,CONTAINS子句以及所有-*是全文本的通配符,%仅用于LIKE子句。 我现在已经在多个地方阅读过,MS SQL不支持“前导通...
心有灵_夕 2019-12-24 21:47:29 0 浏览量 回答数 1

问题

mongodb 3.0.2 是否支持中文的全文索引?如果不支持是否配置词库即可?

mongodb 3.0.2的版本现在是否支持了对中文的全文检索? 还是说配置词库便可? 各位大侠能否提供个例子,还有,全文检索的性能如何?场景是:聊天记录使用mongodb存储,支持聊天记录得搜索,如果用mongodb提供的like操作...
落地花开啦 2019-12-01 20:01:04 1468 浏览量 回答数 1

问题

mysql全文搜索如何支持起始模糊查询?

本问题来自云栖社区【阿里Java技术进阶2群】。https://yq.aliyun.com/articles/690084 点击链接欢迎加入社区大社群。...
李博 bluemind 2019-12-01 19:39:00 259 浏览量 回答数 2

回答

您可能可以使用该LIKE子句进行一些简单的字符串匹配: SELECT * FROM items WHERE items.xml LIKE '%123456%' 如果您需要更多高级功能,请在此处查看MySQL的全文本搜索功能: http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html来源:stack overflow
保持可爱mmm 2020-05-17 14:00:10 0 浏览量 回答数 0

问题

在使用PostgreSQL作为千万级文档的全文检索方案时,遇到性能瓶颈

近期业务需要,准备上全文检索功能。原始数据是2000W+的txt文件,每个文件里面一段文字,平均单个文件大小100k吧。 考虑到对PG的熟悉,也知道它支持全文检索,所以也没多想,就开始往里面导数据……建索引……搜索……掉坑……!!! ———...
troyzhao 2019-12-01 19:32:12 1782 浏览量 回答数 2

回答

你看一下,配置文件放的位置,idea和eclipes配置文件放的文职不一样,在eclipse中,把资源文件放在src文件夹下,是可以找到的; 但是在idea中,直接把资源文件放在src文件夹下,如果不进行设置,是不能被找到的。 你全文搜索下113.118那个ip,ctrl+shift+f root@ip这个ip是你本机的ip
爱吃鱼的程序员 2020-06-23 13:40:37 0 浏览量 回答数 0

回答

1、MySQL 4.x版本及以上版本提供了全文检索(备注:FULLTEXT)支持,但是表的存储引擎类型必须为MyISAM。   2、创建方法:      修改表结构添加全文索引 ALTER TABLE article ADD FULLTEXT index_content(content) –直接创建索引 CREATE FULLTEXT INDEX index_content ON article(content)  3、查询语言的写法:    SELECT url FROM domainlists_url  WHERE MATCH (全文索引的字段名称) AGAINST ('查询内容') order by id desc LIMIT 10 4、更改mysql默认的搜索长度      1、查询现有的长度:          SHOW VARIABLES LIKE 'ft_min_word_len';结果如下              2、更改mysql默认长度         1、windows系统下更改,在my.ini文件中加入:           [mysqld]           ft_min_word_len = 2         重启apache即可        2、linux系统下更改:方法同上
梦丫头 2019-12-02 02:39:01 0 浏览量 回答数 0

问题

PostgreSQL全文检索的性能问题

近期业务需要,准备上全文检索功能。原始数据是2000W+的txt文件,每个文件里面一段文字,平均单个文件大小100k。在实施过程中,遇到性能问题。硬件配置:阿里云ECS,2CPU/8G内存,自己安装的PG(注意:不是那个独立的RDS产品)P...
troyzhao 2019-12-01 19:32:12 1843 浏览量 回答数 1

回答

更新资料 从表开始MySQL 5.6,InnoDB表支持Match... Against。 第一个要好得多。在MyISAM表上,它将对这些列使用全文本索引。另一个将进行全表扫描,在每一行上进行合并,然后进行比较。 LIKE 仅在针对以下情况这样做才有效: 列(不是功能的结果,除非您的特定数据库供应商支持功能索引(例如,Oracle)并且您正在使用它们); 列的开始(即LIKE 'blah%'与相对LIKE '%blah%');和 被索引的列。 如果其中任何一个条件都不成立,则SQL引擎执行查询的唯一方法是进行全表扫描。这可以在大约1万到2万行下使用。除此之外,它很快变得不可用。 注意:在MySQL上,MATCH的一个问题是它似乎只能与整个单词匹配,因此搜索“ bla”不会匹配值为“ blah”的列,但是搜索“ bla *”会匹配。来源:stack overflow
保持可爱mmm 2020-05-17 18:56:48 0 浏览量 回答数 0

问题

PHP MYSQL布尔型全文本搜索

我发现布尔全文本搜索非常有用,但是由于某些原因,我无法弄清楚为什么我无法从查询中得到结果。 我的查询如下: if(isset($_REQUEST['fname']) and $_...
保持可爱mmm 2019-12-01 21:57:45 2 浏览量 回答数 1

回答

忘记这茬了,ldconfig,已经解决 ###### 哈, 自问自答.....    话说, friso并没有提供--help文档, 只有一个开发帮助的pdf文档... ###### 引用来自“狮子的魂”的答案 哈, 自问自答.....    话说, friso并没有提供--help文档, 只有一个开发帮助的pdf文档... 我用是会用了,我不知道这玩意具体的使用场景是啥?分词的话搜索引擎都会帮你做了呀。。 ###### 信息检索, 语音合成, 语音识别, 文本自动分类, 机器翻译, 关键字提取....... 其中在信息检索中用的最多, 一般的全文索引组建没有提供中文分词工具, 例如: xapian, zebra等.... 都没有..... 如果是用在php里面的话, 我提供了一个robbe扩展... ###### 另外搜索引擎和全文索引是不一样的: 搜索引擎包括: 网络爬虫, 文档处理(去重...), 全文索引(需要中文分词), 查询接口. 我们通常用的是"全文索引"类库, 只是搜索引擎的一部分, 而这些类库基本都是国外的, 加上中文分词的复杂, 里面一般都没有中文分词的类库, 就像lucene, 自带的不好用... ###### 引用来自“狮子的魂”的答案 信息检索, 语音合成, 语音识别, 文本自动分类, 机器翻译, 关键字提取....... 其中在信息检索中用的最多, 一般的全文索引组建没有提供中文分词工具, 例如: xapian, zebra等.... 都没有..... 如果是用在php里面的话, 我提供了一个robbe扩展... 嗯,受教了,我用的是coreseek,这个是基于俄罗人开发的sphinx的。 我测试了下如果用你开发的这套东西的话,我可以用原生的sphinx了。例如搜索“广州市人民医院”,直接通过robbe 分成“广州市” “人民“ “医院”,然后直接放到sphinx API里去搜,我用的对吗? ###### 分词重点用在索引的建立和查询过程. 1. 你可以修改sphinx, 将friso内嵌到sphinx当作默认的分词程序. 然后你的spinx的调用接口不变.... 2. 我先前是将利用robbe分词(因为是给php用), 然后在将切分结果base64编码, 再将编码后的词条使用空格串接起来.  在给sphinx用, sphinx会自动用自带的英文分词程序再切分.. http://my.oschina.net/jcseg/blog/111106 里面的示例代码兴许会有帮助. 最好的办法是第一种(但是, 需要对sphinx设计比较熟悉, 才能很好的将friso嵌入到sphinx作为默认的分词程序), 第二种最简单... ###### 引用来自“狮子的魂”的答案 分词重点用在索引的建立和查询过程. 1. 你可以修改sphinx, 将friso内嵌到sphinx当作默认的分词程序. 然后你的spinx的调用接口不变.... 2. 我先前是将利用robbe分词(因为是给php用), 然后在将切分结果base64编码, 再将编码后的词条使用空格串接起来.  在给sphinx用, sphinx会自动用自带的英文分词程序再切分.. http://my.oschina.net/jcseg/blog/111106 里面的示例代码兴许会有帮助. 最好的办法是第一种(但是, 需要对sphinx设计比较熟悉, 才能很好的将friso嵌入到sphinx作为默认的分词程序), 第二种最简单... 修改sphinx的话对于我来说现在难度太大了,之前是用shinx_for_chinese,但是这玩意在建立索引的时候就已经把词分好了, 所以才导致这种结果:例如搜“广州市物友电子科技有限公司”可以搜到,但是你搜“广州市物友电子科技有限”就搜不到“广州市物友电子科技有限公司”了。后来我就转coreseek了,这玩意的分词是libmmseg,和你的friso一样都是基于mmseg算法实现的,用的是最新测试版的,在线上运行的时候,--rotate建索引的时候出问题了,貌似是BUG,也查不到个所以然,再说这玩意有些年头没更新了,稳定版还是基于sphinx0.9.9的,回退到这个版本的话API里很多东西都不适用了。现在我看到你开发的这个东西,感觉应该适合我们,这样的话可以用原生的sphinx,我打算好好测试测试,但是你推荐第一种,我用第二种会有问题吗? ###### 引用来自“狮子的魂”的答案 分词重点用在索引的建立和查询过程. 1. 你可以修改sphinx, 将friso内嵌到sphinx当作默认的分词程序. 然后你的spinx的调用接口不变.... 2. 我先前是将利用robbe分词(因为是给php用), 然后在将切分结果base64编码, 再将编码后的词条使用空格串接起来.  在给sphinx用, sphinx会自动用自带的英文分词程序再切分.. http://my.oschina.net/jcseg/blog/111106 里面的示例代码兴许会有帮助. 最好的办法是第一种(但是, 需要对sphinx设计比较熟悉, 才能很好的将friso嵌入到sphinx作为默认的分词程序), 第二种最简单... 汗,我的数据量是30W的100倍啊,呵呵。如果mysql能解决的话,就好了。。。 ###### 引用来自“宝仔love”的答案 引用来自“狮子的魂”的答案 分词重点用在索引的建立和查询过程. 1. 你可以修改sphinx, 将friso内嵌到sphinx当作默认的分词程序. 然后你的spinx的调用接口不变.... 2. 我先前是将利用robbe分词(因为是给php用), 然后在将切分结果base64编码, 再将编码后的词条使用空格串接起来.  在给sphinx用, sphinx会自动用自带的英文分词程序再切分.. http://my.oschina.net/jcseg/blog/111106 里面的示例代码兴许会有帮助. 最好的办法是第一种(但是, 需要对sphinx设计比较熟悉, 才能很好的将friso嵌入到sphinx作为默认的分词程序), 第二种最简单... 修改sphinx的话对于我来说现在难度太大了,之前是用shinx_for_chinese,但是这玩意在建立索引的时候就已经把词分好了, 所以才导致这种结果:例如搜“广州市物友电子科技有限公司”可以搜到,但是你搜“广州市物友电子科技有限”就搜不到“广州市物友电子科技有限公司”了。后来我就转coreseek了,这玩意的分词是libmmseg,和你的friso一样都是基于mmseg算法实现的,用的是最新测试版的,在线上运行的时候,--rotate建索引的时候出问题了,貌似是BUG,也查不到个所以然,再说这玩意有些年头没更新了,稳定版还是基于sphinx0.9.9的,回退到这个版本的话API里很多东西都不适用了。现在我看到你开发的这个东西,感觉应该适合我们,这样的话可以用原生的sphinx,我打算好好测试测试,但是你推荐第一种,我用第二种会有问题吗? 呵呵……这个当初在robbe-1.0发布的时候我就取用它测试了sphinx0.9.9。效果很好,就是用base64转吗也很高效,但是那时候friso1.0的分词效果还不是很好。现在分词好了搜索的精准度高些了。就是那个相关度排序的问题,不知道转换了base64编码后跟中文的相关度是否与误差!
优选2 2020-06-05 11:37:47 0 浏览量 回答数 0

回答

忘记这茬了,ldconfig,已经解决 ###### 哈, 自问自答.....    话说, friso并没有提供--help文档, 只有一个开发帮助的pdf文档... ###### 引用来自“狮子的魂”的答案 哈, 自问自答.....    话说, friso并没有提供--help文档, 只有一个开发帮助的pdf文档... 我用是会用了,我不知道这玩意具体的使用场景是啥?分词的话搜索引擎都会帮你做了呀。。 ###### 信息检索, 语音合成, 语音识别, 文本自动分类, 机器翻译, 关键字提取....... 其中在信息检索中用的最多, 一般的全文索引组建没有提供中文分词工具, 例如: xapian, zebra等.... 都没有..... 如果是用在php里面的话, 我提供了一个robbe扩展... ###### 另外搜索引擎和全文索引是不一样的: 搜索引擎包括: 网络爬虫, 文档处理(去重...), 全文索引(需要中文分词), 查询接口. 我们通常用的是"全文索引"类库, 只是搜索引擎的一部分, 而这些类库基本都是国外的, 加上中文分词的复杂, 里面一般都没有中文分词的类库, 就像lucene, 自带的不好用... ###### 引用来自“狮子的魂”的答案 信息检索, 语音合成, 语音识别, 文本自动分类, 机器翻译, 关键字提取....... 其中在信息检索中用的最多, 一般的全文索引组建没有提供中文分词工具, 例如: xapian, zebra等.... 都没有..... 如果是用在php里面的话, 我提供了一个robbe扩展... 嗯,受教了,我用的是coreseek,这个是基于俄罗人开发的sphinx的。 我测试了下如果用你开发的这套东西的话,我可以用原生的sphinx了。例如搜索“广州市人民医院”,直接通过robbe 分成“广州市” “人民“ “医院”,然后直接放到sphinx API里去搜,我用的对吗? ###### 分词重点用在索引的建立和查询过程. 1. 你可以修改sphinx, 将friso内嵌到sphinx当作默认的分词程序. 然后你的spinx的调用接口不变.... 2. 我先前是将利用robbe分词(因为是给php用), 然后在将切分结果base64编码, 再将编码后的词条使用空格串接起来.  在给sphinx用, sphinx会自动用自带的英文分词程序再切分.. http://my.oschina.net/jcseg/blog/111106 里面的示例代码兴许会有帮助. 最好的办法是第一种(但是, 需要对sphinx设计比较熟悉, 才能很好的将friso嵌入到sphinx作为默认的分词程序), 第二种最简单... ###### 引用来自“狮子的魂”的答案 分词重点用在索引的建立和查询过程. 1. 你可以修改sphinx, 将friso内嵌到sphinx当作默认的分词程序. 然后你的spinx的调用接口不变.... 2. 我先前是将利用robbe分词(因为是给php用), 然后在将切分结果base64编码, 再将编码后的词条使用空格串接起来.  在给sphinx用, sphinx会自动用自带的英文分词程序再切分.. http://my.oschina.net/jcseg/blog/111106 里面的示例代码兴许会有帮助. 最好的办法是第一种(但是, 需要对sphinx设计比较熟悉, 才能很好的将friso嵌入到sphinx作为默认的分词程序), 第二种最简单... 修改sphinx的话对于我来说现在难度太大了,之前是用shinx_for_chinese,但是这玩意在建立索引的时候就已经把词分好了, 所以才导致这种结果:例如搜“广州市物友电子科技有限公司”可以搜到,但是你搜“广州市物友电子科技有限”就搜不到“广州市物友电子科技有限公司”了。后来我就转coreseek了,这玩意的分词是libmmseg,和你的friso一样都是基于mmseg算法实现的,用的是最新测试版的,在线上运行的时候,--rotate建索引的时候出问题了,貌似是BUG,也查不到个所以然,再说这玩意有些年头没更新了,稳定版还是基于sphinx0.9.9的,回退到这个版本的话API里很多东西都不适用了。现在我看到你开发的这个东西,感觉应该适合我们,这样的话可以用原生的sphinx,我打算好好测试测试,但是你推荐第一种,我用第二种会有问题吗? ###### 引用来自“狮子的魂”的答案 分词重点用在索引的建立和查询过程. 1. 你可以修改sphinx, 将friso内嵌到sphinx当作默认的分词程序. 然后你的spinx的调用接口不变.... 2. 我先前是将利用robbe分词(因为是给php用), 然后在将切分结果base64编码, 再将编码后的词条使用空格串接起来.  在给sphinx用, sphinx会自动用自带的英文分词程序再切分.. http://my.oschina.net/jcseg/blog/111106 里面的示例代码兴许会有帮助. 最好的办法是第一种(但是, 需要对sphinx设计比较熟悉, 才能很好的将friso嵌入到sphinx作为默认的分词程序), 第二种最简单... 汗,我的数据量是30W的100倍啊,呵呵。如果mysql能解决的话,就好了。。。 ###### 引用来自“宝仔love”的答案 引用来自“狮子的魂”的答案 分词重点用在索引的建立和查询过程. 1. 你可以修改sphinx, 将friso内嵌到sphinx当作默认的分词程序. 然后你的spinx的调用接口不变.... 2. 我先前是将利用robbe分词(因为是给php用), 然后在将切分结果base64编码, 再将编码后的词条使用空格串接起来.  在给sphinx用, sphinx会自动用自带的英文分词程序再切分.. http://my.oschina.net/jcseg/blog/111106 里面的示例代码兴许会有帮助. 最好的办法是第一种(但是, 需要对sphinx设计比较熟悉, 才能很好的将friso嵌入到sphinx作为默认的分词程序), 第二种最简单... 修改sphinx的话对于我来说现在难度太大了,之前是用shinx_for_chinese,但是这玩意在建立索引的时候就已经把词分好了, 所以才导致这种结果:例如搜“广州市物友电子科技有限公司”可以搜到,但是你搜“广州市物友电子科技有限”就搜不到“广州市物友电子科技有限公司”了。后来我就转coreseek了,这玩意的分词是libmmseg,和你的friso一样都是基于mmseg算法实现的,用的是最新测试版的,在线上运行的时候,--rotate建索引的时候出问题了,貌似是BUG,也查不到个所以然,再说这玩意有些年头没更新了,稳定版还是基于sphinx0.9.9的,回退到这个版本的话API里很多东西都不适用了。现在我看到你开发的这个东西,感觉应该适合我们,这样的话可以用原生的sphinx,我打算好好测试测试,但是你推荐第一种,我用第二种会有问题吗? 呵呵……这个当初在robbe-1.0发布的时候我就取用它测试了sphinx0.9.9。效果很好,就是用base64转吗也很高效,但是那时候friso1.0的分词效果还不是很好。现在分词好了搜索的精准度高些了。就是那个相关度排序的问题,不知道转换了base64编码后跟中文的相关度是否与误差!
爱吃鱼的程序员 2020-06-02 15:03:04 0 浏览量 回答数 0

回答

忘记这茬了,ldconfig,已经解决 ###### 哈, 自问自答.....    话说, friso并没有提供--help文档, 只有一个开发帮助的pdf文档... ###### 引用来自“狮子的魂”的答案 哈, 自问自答.....    话说, friso并没有提供--help文档, 只有一个开发帮助的pdf文档... 我用是会用了,我不知道这玩意具体的使用场景是啥?分词的话搜索引擎都会帮你做了呀。。 ###### 信息检索, 语音合成, 语音识别, 文本自动分类, 机器翻译, 关键字提取....... 其中在信息检索中用的最多, 一般的全文索引组建没有提供中文分词工具, 例如: xapian, zebra等.... 都没有..... 如果是用在php里面的话, 我提供了一个robbe扩展... ###### 另外搜索引擎和全文索引是不一样的: 搜索引擎包括: 网络爬虫, 文档处理(去重...), 全文索引(需要中文分词), 查询接口. 我们通常用的是"全文索引"类库, 只是搜索引擎的一部分, 而这些类库基本都是国外的, 加上中文分词的复杂, 里面一般都没有中文分词的类库, 就像lucene, 自带的不好用... ###### 引用来自“狮子的魂”的答案 信息检索, 语音合成, 语音识别, 文本自动分类, 机器翻译, 关键字提取....... 其中在信息检索中用的最多, 一般的全文索引组建没有提供中文分词工具, 例如: xapian, zebra等.... 都没有..... 如果是用在php里面的话, 我提供了一个robbe扩展... 嗯,受教了,我用的是coreseek,这个是基于俄罗人开发的sphinx的。 我测试了下如果用你开发的这套东西的话,我可以用原生的sphinx了。例如搜索“广州市人民医院”,直接通过robbe 分成“广州市” “人民“ “医院”,然后直接放到sphinx API里去搜,我用的对吗? ###### 分词重点用在索引的建立和查询过程. 1. 你可以修改sphinx, 将friso内嵌到sphinx当作默认的分词程序. 然后你的spinx的调用接口不变.... 2. 我先前是将利用robbe分词(因为是给php用), 然后在将切分结果base64编码, 再将编码后的词条使用空格串接起来.  在给sphinx用, sphinx会自动用自带的英文分词程序再切分.. http://my.oschina.net/jcseg/blog/111106 里面的示例代码兴许会有帮助. 最好的办法是第一种(但是, 需要对sphinx设计比较熟悉, 才能很好的将friso嵌入到sphinx作为默认的分词程序), 第二种最简单... ###### 引用来自“狮子的魂”的答案 分词重点用在索引的建立和查询过程. 1. 你可以修改sphinx, 将friso内嵌到sphinx当作默认的分词程序. 然后你的spinx的调用接口不变.... 2. 我先前是将利用robbe分词(因为是给php用), 然后在将切分结果base64编码, 再将编码后的词条使用空格串接起来.  在给sphinx用, sphinx会自动用自带的英文分词程序再切分.. http://my.oschina.net/jcseg/blog/111106 里面的示例代码兴许会有帮助. 最好的办法是第一种(但是, 需要对sphinx设计比较熟悉, 才能很好的将friso嵌入到sphinx作为默认的分词程序), 第二种最简单... 修改sphinx的话对于我来说现在难度太大了,之前是用shinx_for_chinese,但是这玩意在建立索引的时候就已经把词分好了, 所以才导致这种结果:例如搜“广州市物友电子科技有限公司”可以搜到,但是你搜“广州市物友电子科技有限”就搜不到“广州市物友电子科技有限公司”了。后来我就转coreseek了,这玩意的分词是libmmseg,和你的friso一样都是基于mmseg算法实现的,用的是最新测试版的,在线上运行的时候,--rotate建索引的时候出问题了,貌似是BUG,也查不到个所以然,再说这玩意有些年头没更新了,稳定版还是基于sphinx0.9.9的,回退到这个版本的话API里很多东西都不适用了。现在我看到你开发的这个东西,感觉应该适合我们,这样的话可以用原生的sphinx,我打算好好测试测试,但是你推荐第一种,我用第二种会有问题吗? ###### 引用来自“狮子的魂”的答案 分词重点用在索引的建立和查询过程. 1. 你可以修改sphinx, 将friso内嵌到sphinx当作默认的分词程序. 然后你的spinx的调用接口不变.... 2. 我先前是将利用robbe分词(因为是给php用), 然后在将切分结果base64编码, 再将编码后的词条使用空格串接起来.  在给sphinx用, sphinx会自动用自带的英文分词程序再切分.. http://my.oschina.net/jcseg/blog/111106 里面的示例代码兴许会有帮助. 最好的办法是第一种(但是, 需要对sphinx设计比较熟悉, 才能很好的将friso嵌入到sphinx作为默认的分词程序), 第二种最简单... 汗,我的数据量是30W的100倍啊,呵呵。如果mysql能解决的话,就好了。。。 ###### 引用来自“宝仔love”的答案 引用来自“狮子的魂”的答案 分词重点用在索引的建立和查询过程. 1. 你可以修改sphinx, 将friso内嵌到sphinx当作默认的分词程序. 然后你的spinx的调用接口不变.... 2. 我先前是将利用robbe分词(因为是给php用), 然后在将切分结果base64编码, 再将编码后的词条使用空格串接起来.  在给sphinx用, sphinx会自动用自带的英文分词程序再切分.. http://my.oschina.net/jcseg/blog/111106 里面的示例代码兴许会有帮助. 最好的办法是第一种(但是, 需要对sphinx设计比较熟悉, 才能很好的将friso嵌入到sphinx作为默认的分词程序), 第二种最简单... 修改sphinx的话对于我来说现在难度太大了,之前是用shinx_for_chinese,但是这玩意在建立索引的时候就已经把词分好了, 所以才导致这种结果:例如搜“广州市物友电子科技有限公司”可以搜到,但是你搜“广州市物友电子科技有限”就搜不到“广州市物友电子科技有限公司”了。后来我就转coreseek了,这玩意的分词是libmmseg,和你的friso一样都是基于mmseg算法实现的,用的是最新测试版的,在线上运行的时候,--rotate建索引的时候出问题了,貌似是BUG,也查不到个所以然,再说这玩意有些年头没更新了,稳定版还是基于sphinx0.9.9的,回退到这个版本的话API里很多东西都不适用了。现在我看到你开发的这个东西,感觉应该适合我们,这样的话可以用原生的sphinx,我打算好好测试测试,但是你推荐第一种,我用第二种会有问题吗? 呵呵……这个当初在robbe-1.0发布的时候我就取用它测试了sphinx0.9.9。效果很好,就是用base64转吗也很高效,但是那时候friso1.0的分词效果还不是很好。现在分词好了搜索的精准度高些了。就是那个相关度排序的问题,不知道转换了base64编码后跟中文的相关度是否与误差!
爱吃鱼的程序员 2020-05-30 14:01:40 0 浏览量 回答数 0

回答

Timeline 模型是针对消息数据场景所设计的数据模型,它能满足消息数据场景对消息保序、海量消息存储、实时同步的特殊需求,同时支持全文检索与多维度组合查询。可以同时应用在IM、Feed流等消息场景的实现上。 模型结构 Timeline模型以简单为设计目标,核心模块构成比较清晰明了。模型尽量提升使用的自由度,让您能够根据自身场景需求选择更为合适的实现。模型的架构主要包括: Store:Timeline存储库,类似数据库的表的概念。 Identifier:用于区分Timeline的唯一标识。 Meta:用于描述Timeline的元数据,元数据描述采用free-schema结构,可自由包含任意列。 Queue:一个Timeline内所有Message存储在Queue内。 SequenceId:Queue中消息体的序列号,需保证递增、唯一,模型支持自增列、自定义两种实现模式。 Message:Timeline内传递的消息体,是一个free-schema的结构,可自由包含任意列。 Index:包含Meta Index和Message Index,可对Meta或Message内的任意列自定义索引,提供灵活的多条件组合查询和搜索。 模型结构 功能介绍 Timeline模型支持以下功能: 支持Meta、消息的基本管理(数据的CRUD)。 支持Meta、消息的多维组合查询、全文检索。 支持SequenceId的两种设置:自增列、手动设置。 支持多列的Timeline Identifier。 兼容Timeline 1.X模型,提供的TimelineMessageForV1样例可直接读、写V1版本消息。 Timeline com.aliyun.openservices.tablestore Timeline 2.0.0 Tablestore Java SDK(模型已合入SDK) com.aliyun.openservices tablestore 4.12.1 原文链接:https://help.aliyun.com/document_detail/89885.html
保持可爱mmm 2019-12-02 03:09:45 0 浏览量 回答数 0

回答

以下是我列出的2020年Java开发者应该学习的技术: 1、DevOps (Docker and Jenkins) 过去的一年,越来越多的公司正在转型DevOps,DevOps非常庞大,需要学习很多工具和原理,但你不需要担心。有大神已经分享了DevOps路线图(https://github.com/kamranahmedse/developer-roadmap,可以按照这个路线图以自己的速度学习和掌握DevOps。 如果你是一个有经验的Java程序员,愿意学习环境管理、自动化和整体改进,你也可以成为DevOps工程师。 2、Java 9 - Java 15 相信现在很多Java开发人员主要使用的Java版本还是以Java 8为主,虽然Java 9 - Java 13已经推出了有一段时间。 但是作为Java程序员,我们可能因为某些原因没办法在线上环境真正的进行JDK的升级,但是花一些时间学习Java 9、Java 10、Java 11、Java 12和 Java 13的新特性还是有必要的。 另外,大家可以重点关注一些关键特性,如GC相关的特性、对编码风格有改变的特性等。还有就是Java的LTS版本(Java 8、Java 11)要重点学习。 还要提醒大家一点,在2020年,Oracle还会推出Java 14 和 Java 15!!!如果你在使用Java 7的话,马上就要被"套圈"了! 3、Spring Framework 5 2017年我们见证了Spring和Java生态系统的许多重大升级,Spring 5.0就是其中之一。Spring 5 的新反应式编程模型、HTTP/2 支持,以及 Spring 通过 Kotlin 对函数式编程的全面支持这些都值得我们好好了解一下。 4、Spring Security 5.0 Spring Security 5.0 提供了许多新功能,并支持 Spring Framework 5.0,总共有 400 多个增强功能和 bug 修复。在Spring Security 5.0.0之前,密码是明文保存,十分不安全。因为这一次发布的是大版本,所以我们决定使用更安全的密码存储方式。Spring Security 5.0.0的主要亮点在于它只需要最小化的JDK 8、反应式安全特性、OAuth 2.0(OIDC)和现代密码存储。 5、Spring Boot 2 Spring Boot 2.0 基于 Spring 5 Framework ,提供了 异步非阻塞 IO 的响应式 Stream 、非堵塞的函数式 Reactive Web 框架 Spring WebFlux等特性。很多使用过SpringBoot的人都知道,使用SpringBoot搭建Web应用真的是又快又好,相信Spring Boot 2会带来更多惊喜。 6、Hadoop、Spark 和 Kafka 另外在2020年Java程序员需要学习的是大数据相关的知识。特别是Apache Spark 和 Kafka两个框架。 如果你也想在2020年学习大数据,也一定绕不开Hadoop生态。 7、Elasticsearch 全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选。维基百科、Stack Overflow、Github 都在使用它。 Elasticsearch是一个基于Lucene库的搜索引擎。它提供了一个分布式、支持多租户的全文搜索引擎,具有HTTP Web接口和无模式JSON文档。Elasticsearch是用Java开发的,并在Apache许可证下作为开源软件发布。 8、ServiceMesh 这两年很火,火的一塌糊涂。在2019年,但凡是程序员相关的大会,如果没有讲ServiceMest的专题,那都不好意思开。 所有人都在说 ServiceMesh; 几乎没人知道怎么落地 ServiceMesh; 但是大家都觉得其他人在大力做 ServiceMesh; 所以大家都宣称自己在做 ServiceMesh; 这个号称下一代微服务架构的概念,现在对于大多数人来说根本不知道是啥。只知道很多大厂宣称自己在做,很多大牛在布道。 9、Serverless 无服务器运算(英语:Serverless computing),又被称为功能即服务(Function-as-a-Service,缩写为 FaaS),是云计算的一种模型。以平台即服务(PaaS)为基础,无服务器运算提供一个微型的架构,终端客户不需要部署、配置或管理服务器服务,代码运行所需要的服务器服务皆由云平台来提供。这东西,听上去就很高大上。 2019年,和ServiceMesh一样,所有人都宣称自己在做。但是又很很多人不知道他到底是什么。 10、Kotlin 如果大家有关注Java 13的新特性的话,一定知道推出了字符串文本块的功能,这个功能其实是借鉴的Kotlin,除此之外,最近几年,Java有很多特性都在借鉴Kotlin,相比较于Java,Kotlin更加简洁,而且Kotlin编出来的代码也可以直接通过JVM运行。 Kotlin是一种在Java虚拟机上运行的静态类型编程语言,它也可以被编译成为JavaScript源代码。Kotlin的设计初衷就是用来生产高性能要求的程序的,所以运行起来和Java也是不相上下。Kotlin可以从 JetBrains InteilliJ Idea IDE这个开发工具以插件形式使用。 总结 以上,就是作者总结的建议Java程序员在2020年学习的一些技术,其中有一些是一定要学习的,还有一些是看大家的精力情况酌情考虑。
剑曼红尘 2020-04-07 20:42:52 0 浏览量 回答数 0

问题

wampserver2.5局域网IP访问配置

1.wampserver2.5集成环境的安装和使用网上有很多教材。安装好后找到apache的配置文件httpd.conf。默认位置是: swap安装目录\wamp\bin\apache\apache2.4.9\conf\htt...
青蛙跳 2019-12-01 20:57:35 2529 浏览量 回答数 1

问题

电子档案/文档管理系统重构及优化:配置报错 

【业务需求】 文档在线浏览优化:在不同浏览器中风格统一:默认缩放以页宽显示、不显示打印、下载等、提供缩放、旋转、搜索、选择复制等基本功能。--目前采用pdf.js,但对低版本浏览器无效࿰...
kun坤 2020-06-01 11:05:52 1 浏览量 回答数 1

问题

阿里云云周刊第16期(11.7-11.13)

本周热门 查看更多 阿里云RDS产品经理访谈,等你来提问 我们...
xiaofanqie 2019-12-01 21:15:11 21676 浏览量 回答数 16

回答

SpringBoot整合ES 创建SpringBoot项目,导入 ES 6.2.1 的 RestClient 依赖和 ES 依赖。在项目中直接引用 es-starter 的话会报容器初始化异常错误,导致项目无法启动。如果有读者解决了这个问题,欢迎留言交流 org.elasticsearch.client elasticsearch-rest-high-level-client ${elasticsearch.version} org.elasticsearch elasticsearch ${elasticsearch.version} 为容器定义 RestClient 对象 /** * 在Spring容器中定义 RestClient 对象 * @Author: keats_coder * @Date: 2019/8/9 * @Version 1.0 * */ @Configuration public class ESConfig { @Value("${yunshangxue.elasticsearch.hostlist}") private String hostlist; // 127.0.0.1:9200 @Bean // 高版本客户端 public RestHighLevelClient restHighLevelClient() { // 解析 hostlist 配置信息。假如以后有多个,则需要用 , 分开 String[] split = hostlist.split(","); // 创建 HttpHost 数组,其中存放es主机和端口的配置信息 HttpHost[] httpHostArray = new HttpHost[split.length]; for (int i = 0; i < split.length; i++) { String item = split[i]; httpHostArray[i] = new HttpHost(item.split(":")[0], Integer.parseInt(item.split(":")[1]), "http"); } // 创建RestHighLevelClient客户端 return new RestHighLevelClient(RestClient.builder(httpHostArray)); } // 项目主要使用 RestHighLevelClient,对于低级的客户端暂时不用 @Bean public RestClient restClient() { // 解析hostlist配置信息 String[] split = hostlist.split(","); // 创建HttpHost数组,其中存放es主机和端口的配置信息 HttpHost[] httpHostArray = new HttpHost[split.length]; for (int i = 0; i < split.length; i++) { String item = split[i]; httpHostArray[i] = new HttpHost(item.split(":")[0], Integer.parseInt(item.split(":")[1]), "http"); } return RestClient.builder(httpHostArray).build(); } } 在 yml 文件中配置 eshost yunshangxue: elasticsearch: hostlist: ${eshostlist:127.0.0.1:9200} 调用相关 API 执行操作 创建操作索引的对象 构建操作索引的请求 调用对象的相关API发送请求 获取响应消息 /** * 删除索引库 */ @Test public void testDelIndex() throws IOException { // 操作索引的对象 IndicesClient indices = client.indices(); // 删除索引的请求 DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("ysx_course"); // 删除索引 DeleteIndexResponse response = indices.delete(deleteIndexRequest); // 得到响应 boolean b = response.isAcknowledged(); System.out.println(b); } 创建索引, 步骤和删除类似,需要注意的是删除的时候需要指定 ES 库分片的数量和副本的数量,并且在创建索引的时候可以将映射一起指定了。代码如下 public void testAddIndex() throws IOException { // 操作索引的对象 IndicesClient indices = client.indices(); // 创建索引的请求 CreateIndexRequest request = new CreateIndexRequest("ysx_course"); request.settings(Settings.builder().put("number_of_shards", "1").put("number_of_replicas", "0")); // 创建映射 request.mapping("doc", "{\n" + " \"properties\": {\n" + " \"description\": {\n" + " \"type\": \"text\",\n" + " \"analyzer\": \"ik_max_word\",\n" + " \"search_analyzer\": \"ik_smart\"\n" + " },\n" + " \"name\": {\n" + " \"type\": \"text\",\n" + " \"analyzer\": \"ik_max_word\",\n" + " \"search_analyzer\": \"ik_smart\"\n" + " },\n" + "\"pic\":{ \n" + "\"type\":\"text\", \n" + "\"index\":false \n" + "}, \n" + " \"price\": {\n" + " \"type\": \"float\"\n" + " },\n" + " \"studymodel\": {\n" + " \"type\": \"keyword\"\n" + " },\n" + " \"timestamp\": {\n" + " \"type\": \"date\",\n" + " \"format\": \"yyyy-MM‐dd HH:mm:ss||yyyy‐MM‐dd||epoch_millis\"\n" + " }\n" + " }\n" + " }", XContentType.JSON); // 执行创建操作 CreateIndexResponse response = indices.create(request); // 得到响应 boolean b = response.isAcknowledged(); System.out.println(b); } Java API操作ES 准备数据环境 创建索引:ysx_course 创建映射: PUT http://localhost:9200/ysx_course/doc/_mapping { "properties": { "description": { // 课程描述 "type": "text", // String text 类型 "analyzer": "ik_max_word", // 存入的分词模式:细粒度 "search_analyzer": "ik_smart" // 查询的分词模式:粗粒度 }, "name": { // 课程名称 "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_smart" }, "pic":{ // 图片地址 "type":"text", "index":false // 地址不用来搜索,因此不为它构建索引 }, "price": { // 价格 "type": "scaled_float", // 有比例浮点 "scaling_factor": 100 // 比例因子 100 }, "studymodel": { "type": "keyword" // 不分词,全关键字匹配 }, "timestamp": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" } } } 加入原始数据: POST http://localhost:9200/ysx_course/doc/1 { "name": "Bootstrap开发", "description": "Bootstrap是由Twitter推出的一个前台页面开发框架,是一个非常流行的开发框架,此框架集成了多种页面效果。此开发框架包含了大量的CSS、JS程序代码,可以帮助开发者(尤其是不擅长页面开发的程序人员)轻松的实现一个不受浏览器限制的精美界面效果。", "studymodel": "201002", "price":38.6, "timestamp":"2018-04-25 19:11:35", "pic":"group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg" } DSL搜索 DSL(Domain Specific Language)是ES提出的基于json的搜索方式,在搜索时传入特定的json格式的数据来完成不 同的搜索需求。DSL比URI搜索方式功能强大,在项目中建议使用DSL方式来完成搜索。 查询全部 原本我们想要查询全部的话,需要使用 GET 请求发送 _search 命令,如今使用 DSL 方式搜索,可以使用 POST 请求,并在请求体中设置 JSON 字符串来构建查询条件 POST http://localhost:9200/ysx_course/doc/_search 请求体 JSON { "query": { "match_all": {} // 查询全部 }, "_source" : ["name","studymodel"] // 查询结果包括 课程名 + 学习模式两个映射 } 具体的测试方法如下:过程比较繁琐,好在条理还比较清晰 // 搜索全部记录 @Test public void testSearchAll() throws IOException, ParseException { // 搜索请求对象 SearchRequest searchRequest = new SearchRequest("ysx_course"); // 指定类型 searchRequest.types("doc"); // 搜索源构建对象 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); // 搜索方式 // matchAllQuery搜索全部 searchSourceBuilder.query(QueryBuilders.matchAllQuery()); // 设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段 searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{}); // 向搜索请求对象中设置搜索源 searchRequest.source(searchSourceBuilder); // 执行搜索,向ES发起http请求 SearchResponse searchResponse = client.search(searchRequest); // 搜索结果 SearchHits hits = searchResponse.getHits(); // 匹配到的总记录数 long totalHits = hits.getTotalHits(); // 得到匹配度高的文档 SearchHit[] searchHits = hits.getHits(); // 日期格式化对象 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); for(SearchHit hit:searchHits){ // 文档的主键 String id = hit.getId(); // 源文档内容 Map<String, Object> sourceAsMap = hit.getSourceAsMap(); String name = (String) sourceAsMap.get("name"); // 由于前边设置了源文档字段过虑,这时description是取不到的 String description = (String) sourceAsMap.get("description"); // 学习模式 String studymodel = (String) sourceAsMap.get("studymodel"); // 价格 Double price = (Double) sourceAsMap.get("price"); // 日期 Date timestamp = dateFormat.parse((String) sourceAsMap.get("timestamp")); System.out.println(name); System.out.println(studymodel); System.out.println("你看不见我,看不见我~" + description); System.out.println(price); } } 坑:red> 执行过程中遇到的问题:不能对这个值进行初始化,导致 Spring 容器无法初始化 Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'yunshangxue.elasticsearch.hostlist' in value "${yunshangxue.elasticsearch.hostlist}" 通过检查 target 目录发现,生成的 target 文件包中没有将 yml 配置文件带过来... 仔细对比发现,我的项目竟然变成了一个不是 Maven 的项目。重新使用 IDEA 导入 Mavaen 工程之后便能正常运行了 分页查询 我们来 look 一下 ES 的分页查询参数: { // from 起始索引 // size 每页显示的条数 "from" : 0, "size" : 1, "query": { "match_all": {} }, "_source" : ["name","studymodel"] } 1565524349684 通过查询结果可以发现,我们设置了分页参数之后, hits.total 仍然是 3,表示它找到了 3 条数据,而按照分页规则,它只会返回一条数据,因此 hits.hits 里面只有一条数据。这也符合我们的业务规则,在查询前端页面显示总共的条数和当前的数据。 由此,我们就可以通过 Java API 来构建查询条件了:对上面查询全部的代码进行如下改造: // 搜索源构建对象 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); int page = 2; // 页码 int size = 1; // 每页显示的条数 int index = (page - 1) * size; searchSourceBuilder.from(index); searchSourceBuilder.size(1); // 搜索方式 // matchAllQuery搜索全部 searchSourceBuilder.query(QueryBuilders.matchAllQuery()); 精确查询 TermQuery Term Query为精确查询,在搜索时会整体匹配关键字,不再将关键字分词 例如: { "query": { "term": { // 查询的方式为 term 精确查询 "name": "spring" // 查询的字段为 name 关键字是 spring } }, "_source": [ "name", "studymodel" ] } 此时查询的结果是: "hits": [ { "_index": "ysx_course", "_type": "doc", "_id": "3", "_score": 0.9331132, "_source": { "studymodel": "201001", "name": "spring开发基础" } } ] 查询到了上面这条数据,因为 spring开发基础 分完词后是 spring 开发 基础 ,而查询关键字是 spring 不分词,这样当然可以匹配到这条记录,但是当我们修改关键字为 spring开发,按照往常的查询方法,也是可以查询到的。但是 term 不一样,它不会对关键字分词。结果可想而知是查询不到的 JavaAPI如下: // 搜索方式 // termQuery 精确查询 searchSourceBuilder.query(QueryBuilders.termQuery("studymodel", "201002")); 根据 ID 查询: 根据 ID 精确查询和根据其他条件精确查询是一样的,不同的是 id 字段前面有一个下划线注意写上 searchSourceBuilder.query(QueryBuilders.termQuery("_id", "1")); 但是,当一次查询多个 ID 时,相应的 API 也应该改变,使用 termsQuery 而不是 termQuery。多了一个 s 全文检索 MatchQuery MatchQuery 即全文检索,会对关键字进行分词后匹配词条。 query:搜索的关键字,对于英文关键字如果有多个单词则中间要用半角逗号分隔,而对于中文关键字中间可以用 逗号分隔也可以不用 operator:设置查询的结果取交集还是并集,并集用 or, 交集用 and { "query": { "match": { "description": { "query": "spring开发", "operator": "or" } } } } 有时,我们需要设定一个量化的表达方式,例如查询 spring开发基础,这三个词条。我们需求是至少匹配两个词条,这时 operator 属性就不能满足要求了,ES 还提供了另外一个属性:minimum_should_match 用一个百分数来设定应该有多少个词条满足要求。例如查询: “spring开发框架”会被分为三个词:spring、开发、框架 设置"minimum_should_match": "80%"表示,三个词在文档的匹配占比为80%,即3*0.8=2.4,向下取整得2,表 示至少有两个词在文档中要匹配成功。 JavaAPI 通过 matchQuery.minimumShouldMatch 的方式来设置条件 // matchQuery全文检索 searchSourceBuilder.query(QueryBuilders.matchQuery("description", "Spring开发框架").minimumShouldMatch("70%")); 多字段联合搜索 MultiQuery 上面的 MatchQuery 有一个短板,假如用户输入了某关键字,我们在查找的时候并不知道他输入的是 name 还是 description,这时我们用什么都不合适,而 MultiQuery 的出现解决了这个问题,他可以通过 fields 属性来设置多个域联合查找:具体用法如下 { "query": { "multi_match": { "query": "Spring开发", "minimum_should_match": "70%", "fields": ["name", "description"] } } } JavaAPI searchSourceBuilder.query(QueryBuilders.multiMatchQuery("Spring开发框架", "name", "description").minimumShouldMatch("70%")); 提升 boost 在多域联合查询的时候,可以通过 boost 来设置某个域在计算得分时候的比重,比重越高的域当他符合条件时计算的得分越高,相应的该记录也更靠前。通过在 fields 中给相应的字段用 ^权重倍数来实现 "fields": ["name^10", "description"] 上面的代码表示给 name 字段提升十倍权重,查询到的结果: { "_index": "ysx_course", "_type": "doc", "_id": "3", "_score": 13.802518, // 可以清楚的发现,得分竟然是 13 了 "_source": { "name": "spring开发基础", "description": "spring 在java领域非常流行,java程序员都在用。", "studymodel": "201001", "price": 88.6, "timestamp": "2018-02-24 19:11:35", "pic": "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg" } }, 而在 Java 中,仍然可以通过链式编程来实现 searchSourceBuilder.query(QueryBuilders.multiMatchQuery("Spring开发框架", "name", "description").field("name", 10)); // 设置 name 10倍权重 布尔查询 BoolQuery 如果我们既要对一些字段进行分词查询,同时要对另一些字段进行精确查询,就需要使用布尔查询来实现了。布尔查询对应于Lucene的BooleanQuery查询,实现将多个查询组合起来,有三个可选的参数: must:文档必须匹配must所包括的查询条件,相当于 “AND” should:文档应该匹配should所包括的查询条件其中的一个或多个,相当于 "OR" must_not:文档不能匹配must_not所包括的该查询条件,相当于“NOT” { "query": { "bool": { // 布尔查询 "must": [ // 查询条件 must 表示数组中的查询方式所规定的条件都必须满足 { "multi_match": { "query": "spring框架", "minimum_should_match": "50%", "fields": [ "name^10", "description" ] } }, { "term": { "studymodel": "201001" } } ] } } } JavaAPI // 搜索方式 // 首先构造多关键字查询条件 MultiMatchQueryBuilder matchQueryBuilder = QueryBuilders.multiMatchQuery("Spring开发框架", "name", "description").field("name", 10); // 然后构造精确匹配查询条件 TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("studymodel", "201002"); // 组合两个条件,组合方式为 must 全满足 BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); boolQueryBuilder.must(matchQueryBuilder); boolQueryBuilder.must(termQueryBuilder); // 将查询条件封装给查询对象 searchSourceBuilder.query(boolQueryBuilder); 过滤器 定义过滤器查询,是在原本查询结果的基础上对数据进行筛选,因此省略了重新计算的分的步骤,效率更高。并且方便缓存。推荐尽量使用过虑器去实现查询或者过虑器和查询共同使用,过滤器在布尔查询中使用,下边是在搜索结果的基础上进行过滤: { "query": { "bool": { "must": [ { "multi_match": { "query": "spring框架", "minimum_should_match": "50%", "fields": [ "name^10", "description" ] } } ], "filter": [ { // 过滤条件:studymodel 必须是 201001 "term": {"studymodel": "201001"} }, { // 过滤条件:价格 >=60 <=100 "range": {"price": {"gte": 60,"lte": 100}} } ] } } } 注意:range和term一次只能对一个Field设置范围过虑。 JavaAPI // 首先构造多关键字查询条件 MultiMatchQueryBuilder matchQueryBuilder = QueryBuilders.multiMatchQuery("Spring框架", "name", "description").field("name", 10); // 添加条件到布尔查询 BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); boolQueryBuilder.must(matchQueryBuilder); // 通过布尔查询来构造过滤查询 boolQueryBuilder.filter(QueryBuilders.termQuery("studymodel", "201001")); boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(60).lte(100)); // 将查询条件封装给查询对象 searchSourceBuilder.query(boolQueryBuilder); 排序 我们可以在查询的结果上进行二次排序,支持对 keyword、date、float 等类型添加排序,text类型的字段不允许排序。排序使用的 JSON 格式如下: { "query": { "bool": { "filter": [ { "range": { "price": { "gte": 0, "lte": 100 } } } ] } }, "sort": [ // 注意这里排序是写在 query key 的外面的。这就表示它的API也不是布尔查询提供 { "studymodel": "desc" // 对 studymodel(keyword)降序 }, { "price": "asc" // 对 price(double)升序 } ] } 由上面的 JSON 数据可以发现,排序所属的 API 是和 query 评级的,因此在调用 API 时也应该选择对应的 SearchSourceBuilder 对象 // 排序查询 @Test public void testSort() throws IOException, ParseException { // 搜索请求对象 SearchRequest searchRequest = new SearchRequest("ysx_course"); // 指定类型 searchRequest.types("doc"); // 搜索源构建对象 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); // 搜索方式 // 添加条件到布尔查询 BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); // 通过布尔查询来构造过滤查询 boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(0).lte(100)); // 将查询条件封装给查询对象 searchSourceBuilder.query(boolQueryBuilder); // 向搜索请求对象中设置搜索源 searchRequest.source(searchSourceBuilder); // 设置排序规则 searchSourceBuilder.sort("studymodel", SortOrder.DESC); // 第一排序规则 searchSourceBuilder.sort("price", SortOrder.ASC); // 第二排序规则 // 执行搜索,向ES发起http请求 SearchResponse searchResponse = client.search(searchRequest); // 搜索结果 SearchHits hits = searchResponse.getHits(); // 匹配到的总记录数 long totalHits = hits.getTotalHits(); // 得到匹配度高的文档 SearchHit[] searchHits = hits.getHits(); // 日期格式化对象 soutData(searchHits); } 高亮显示 高亮显示可以将搜索结果一个或多个字突出显示,以便向用户展示匹配关键字的位置。 高亮三要素:高亮关键字、高亮前缀、高亮后缀 { "query": { "bool": { "must": [ { "multi_match": { "query": "开发框架", "minimum_should_match": "50%", "fields": [ "name^10", "description" ], "type": "best_fields" } } ] } }, "sort": [ { "price": "asc" } ], "highlight": { "pre_tags": [ "" ], "post_tags": [ "" ], "fields": { "name": {}, "description": {} } } } 查询结果的数据如下: 1565585272091 Java 代码如下,注意到上面的 JSON 数据, highlight 和 sort 和 query 依然是同级的,所以也需要用 SearchSourceBuilder 对象来设置到搜索条件中 // 高亮查询 @Test public void testHighLight() throws IOException, ParseException { // 搜索请求对象 SearchRequest searchRequest = new SearchRequest("ysx_course"); // 指定类型 searchRequest.types("doc"); // 搜索源构建对象 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); // 搜索方式 // 首先构造多关键字查询条件 MultiMatchQueryBuilder matchQueryBuilder = QueryBuilders.multiMatchQuery("Spring框架", "name", "description").field("name", 10); // 添加条件到布尔查询 BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); boolQueryBuilder.must(matchQueryBuilder); // 通过布尔查询来构造过滤查询 boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(60).lte(100)); // 将查询条件封装给查询对象 searchSourceBuilder.query(boolQueryBuilder); // *********************** // 高亮查询 HighlightBuilder highlightBuilder = new HighlightBuilder(); highlightBuilder.preTags("<em>"); // 高亮前缀 highlightBuilder.postTags("</em>"); // 高亮后缀 highlightBuilder.fields().add(new HighlightBuilder.Field("name")); // 高亮字段 // 添加高亮查询条件到搜索源 searchSourceBuilder.highlighter(highlightBuilder); // *********************** // 设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段 searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{}); // 向搜索请求对象中设置搜索源 searchRequest.source(searchSourceBuilder); // 执行搜索,向ES发起http请求 SearchResponse searchResponse = client.search(searchRequest); // 搜索结果 SearchHits hits = searchResponse.getHits(); // 匹配到的总记录数 long totalHits = hits.getTotalHits(); // 得到匹配度高的文档 SearchHit[] searchHits = hits.getHits(); // 日期格式化对象 soutData(searchHits); } 根据查询结果的数据结构来获取高亮的数据,替换原有的数据: private void soutData(SearchHit[] searchHits) throws ParseException { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); for (SearchHit hit : searchHits) { // 文档的主键 String id = hit.getId(); // 源文档内容 Map<String, Object> sourceAsMap = hit.getSourceAsMap(); String name = (String) sourceAsMap.get("name"); // 获取高亮查询的内容。如果存在,则替换原来的name Map<String, HighlightField> highlightFields = hit.getHighlightFields(); if( highlightFields != null ){ HighlightField nameField = highlightFields.get("name"); if(nameField!=null){ Text[] fragments = nameField.getFragments(); StringBuffer stringBuffer = new StringBuffer(); for (Text str : fragments) { stringBuffer.append(str.string()); } name = stringBuffer.toString(); } } // 由于前边设置了源文档字段过虑,这时description是取不到的 String description = (String) sourceAsMap.get("description"); // 学习模式 String studymodel = (String) sourceAsMap.get("studymodel"); // 价格 Double price = (Double) sourceAsMap.get("price"); // 日期 Date timestamp = dateFormat.parse((String) sourceAsMap.get("timestamp")); System.out.println(name); System.out.println(id); System.out.println(studymodel); System.out.println("你看不见我,看不见我~" + description); System.out.println(price); } }
剑曼红尘 2020-04-15 19:21:40 0 浏览量 回答数 0

问题

初识Hadoop:报错

Hadoop一直是我想学习的技术,正巧最近项目组要做电子商城,我就开始研究Hadoop,虽然最后鉴定Hadoop不适用我们的项目,但是我会继续研究下去,技多不压身。  ...
kun坤 2020-06-07 00:57:43 0 浏览量 回答数 1

回答

如大家所知道的,Mysql目前主要有以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE。 那么,这几种索引有什么功能和性能上的不同呢? FULLTEXT 即为全文索引,目前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引。值得一提的是,在数据量较大时候,现将数据放入一个没有全局索引的表中,然后再用CREATE INDEX创建FULLTEXT索引,要比先为一张表建立FULLTEXT然后再将数据写入的速度快很多。 全文索引并不是和MyISAM一起诞生的,它的出现是为了解决WHERE name LIKE “%word%"这类针对文本的模糊查询效率较低的问题。在没有全文索引之前,这样一个查询语句是要进行遍历数据表操作的,可见,在数据量较大时是极其的耗时的,如果没有异步IO处理,进程将被挟持,很浪费时间,当然这里不对异步IO作进一步讲解,想了解的童鞋,自行谷哥。 全文索引的使用方法并不复杂: 创建ALTER TABLE table ADD INDEX FULLINDEX USING FULLTEXT(cname1[,cname2…]); 使用SELECT * FROM table WHERE MATCH(cname1[,cname2…]) AGAINST ('word' MODE ); 其中, MODE为搜寻方式(IN BOOLEAN MODE ,IN NATURAL LANGUAGE MODE ,IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION / WITH QUERY EXPANSION)。 关于这三种搜寻方式,愚安在这里也不多做交代,简单地说,就是,布尔模式,允许word里含一些特殊字符用于标记一些具体的要求,如+表示一定要有,-表示一定没有,*表示通用匹配符,是不是想起了正则,类似吧;自然语言模式,就是简单的单词匹配;含表达式的自然语言模式,就是先用自然语言模式处理,对返回的结果,再进行表达式匹配。 对搜索引擎稍微有点了解的同学,肯定知道分词这个概念,FULLTEXT索引也是按照分词原理建立索引的。西文中,大部分为字母文字,分词可以很方便的按照空格进行分割。但很明显,中文不能按照这种方式进行分词。那又怎么办呢?这个向大家介绍一个Mysql的中文分词插件Mysqlcft,有了它,就可以对中文进行分词,想了解的同学请移步Mysqlcft,当然还有其他的分词插件可以使用。 HASH Hash这个词,可以说,自打我们开始码的那一天起,就开始不停地见到和使用到了。其实,hash就是一种(key=>value)形式的键值对,如数学中的函数映射,允许多个key对应相同的value,但不允许一个key对应多个value。正是由于这个特性,hash很适合做索引,为某一列或几列建立hash索引,就会利用这一列或几列的值通过一定的算法计算出一个hash值,对应一行或几行数据(这里在概念上和函数映射有区别,不要混淆)。在java语言中,每个类都有自己的hashcode()方法,没有显示定义的都继承自object类,该方法使得每一个对象都是唯一的,在进行对象间equal比较,和序列化传输中起到了很重要的作用。hash的生成方法有很多种,足可以保证hash码的唯一性,例如在MongoDB中,每一个document都有系统为其生成的唯一的objectID(包含时间戳,主机散列值,进程PID,和自增ID)也是一种hash的表现。额,我好像扯远了-_-! 由于hash索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。那为什么还需要其他的树形索引呢? 在这里愚安就不自己总结了。引用下园子里其他大神的文章:来自 14的路 的MySQL的btree索引和hash索引的区别 (1)Hash 索引仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询。 由于 Hash 索引比较的是进行 Hash 运算之后的 Hash 值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的 Hash 算法处理之后的 Hash 值的大小关系,并不能保证和Hash运算前完全一样。 (2)Hash 索引无法被用来避免数据的排序操作。 由于 Hash 索引中存放的是经过 Hash 计算之后的 Hash 值,而且Hash值的大小关系并不一定和 Hash 运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算; (3)Hash 索引不能利用部分索引键查询。 对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用。 (4)Hash 索引在任何时候都不能避免表扫描。 前面已经知道,Hash 索引是将索引键通过 Hash 运算之后,将 Hash运算结果的 Hash 值和所对应的行指针信息存放于一个 Hash 表中,由于不同索引键存在相同 Hash 值,所以即使取满足某个 Hash 键值的数据的记录条数,也无法从 Hash 索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果。 (5)Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。 对于选择性比较低的索引键,如果创建 Hash 索引,那么将会存在大量记录指针信息存于同一个 Hash 值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,而造成整体性能低下。 愚安我稍作补充,讲一下HASH索引的过程,顺便解释下上面的第4,5条: 当我们为某一列或某几列建立hash索引时(目前就只有MEMORY引擎显式地支持这种索引),会在硬盘上生成类似如下的文件: hash值 存储地址 1db54bc745a1 77#45b5 4bca452157d4 76#4556,77#45cc… … hash值即为通过特定算法由指定列数据计算出来,磁盘地址即为所在数据行存储在硬盘上的地址(也有可能是其他存储地址,其实MEMORY会将hash表导入内存)。 这样,当我们进行WHERE age = 18 时,会将18通过相同的算法计算出一个hash值==>在hash表中找到对应的储存地址==>根据存储地址取得数据。 所以,每次查询时都要遍历hash表,直到找到对应的hash值,如(4),数据量大了之后,hash表也会变得庞大起来,性能下降,遍历耗时增加,如(5)。 BTREE BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中,相信学过数据结构的童鞋都对当初学习二叉树这种数据结构的经历记忆犹新,反正愚安我当时为了软考可是被这玩意儿好好地折腾了一番,不过那次考试好像没怎么考这个。如二叉树一样,每次查询都是从树的入口root开始,依次遍历node,获取leaf。 BTREE在MyISAM里的形式和Innodb稍有不同 在 Innodb里,有两种形态:一是primary key形态,其leaf node里存放的是数据,而且不仅存放了索引键的数据,还存放了其他字段的数据。二是secondary index,其leaf node和普通的BTREE差不多,只是还存放了指向主键的信息. 而在MyISAM里,主键和其他的并没有太大区别。不过和Innodb不太一样的地方是在MyISAM里,leaf node里存放的不是主键的信息,而是指向数据文件里的对应数据行的信息. RTREE RTREE在mysql很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种。 相对于BTREE,RTREE的优势在于范围查找. 各种索引的使用情况 (1)对于BTREE这种Mysql默认的索引类型,具有普遍的适用性 (2)由于FULLTEXT对中文支持不是很好,在没有插件的情况下,最好不要使用。其实,一些小的博客应用,只需要在数据采集时,为其建立关键字列表,通过关键字索引,也是一个不错的方法,至少愚安我是经常这么做的。 (3)对于一些搜索引擎级别的应用来说,FULLTEXT同样不是一个好的处理方法,Mysql的全文索引建立的文件还是比较大的,而且效率不是很高,即便是使用了中文分词插件,对中文分词支持也只是一般。真要碰到这种问题,Apache的Lucene或许是你的选择。 (4)正是因为hash表在处理较小数据量时具有无可比拟的素的优势,所以hash索引很适合做缓存(内存数据库)。如mysql数据库的内存版本Memsql,使用量很广泛的缓存工具Mencached,NoSql数据库redis等,都使用了hash索引这种形式。当然,不想学习这些东西的话Mysql的MEMORY引擎也是可以满足这种需求的。 (5)至于RTREE,愚安我至今还没有使用过,它具体怎么样,我就不知道了。有RTREE使用经历的同学,到时可以交流下! 答案来源于网络
养狐狸的猫 2019-12-02 02:18:32 0 浏览量 回答数 0

回答

-- drop table testproduct; CREATE TABLE testproduct ( Id VARCHAR(16), prod_name TEXT, ProductIdType VARCHAR(8), PRIMARY KEY (Id), FULLTEXT (prod_name) ) ENGINE=MyISAM; insert into testproduct (id,prod_name,productidtype) values ('B00005N5PF','one pen and a good price for a pen','ASIN'); insert into testproduct (id,prod_name,productidtype) values ('B570J5XS3C',null,'ASIN'); insert into testproduct (id,prod_name,productidtype) values ('C00ZZ5N5PF','let us get rid of some noise','ASIN'); insert into testproduct (id,prod_name,productidtype) values ('D00LL5N5PA','four score and seven years ago our fore...','ASIN'); insert into testproduct (id,prod_name,productidtype) values ('EEEZZ5N5PF','he has a harpoon','ASIN'); insert into testproduct (id,prod_name,productidtype) values ('C01ZZ5N5PF','and then we','ASIN'); insert into testproduct (id,prod_name,productidtype) values ('B00ZZ5N5PF','he has a pen in his pocket not a banana','ASIN'); insert into testproduct (id,prod_name,productidtype) values ('C02ZZ5N5PF','went to the store','ASIN'); insert into testproduct (id,prod_name,productidtype) values ('C03ZZ5N5PF','and decided that we should buy some','ASIN'); insert into testproduct (id,prod_name,productidtype) values ('C04ZZ5N5PF','fruit cups or fruit or berries or pebbles','ASIN'); insert into testproduct (id,prod_name,productidtype) values ('C037Z5N5PF','then he and her she and it','ASIN'); insert into testproduct (id,prod_name,productidtype) values ('C04K95N5PF','threw some daggers and a harpoon','ASIN'); insert into testproduct (id,prod_name,productidtype) values ('D88895N5PF','more noise and some of this','ASIN'); insert into testproduct (id,prod_name,productidtype) values ('D34595N5PF','this article about harpoons really drills into the throwing of harpoon or harpoons to those that deserve a harpoon','ASIN'); insert into testproduct (id,prod_name,productidtype) values ('D12395N5PF','and there we go','ASIN'); 全文搜索需要多种多样的方式来消除重复的“噪音”。用最少的数据进行测试将产生较差的结果。将您的整个收藏集投入其中,以获取有意义的内容。如以下某些链接所示,甚至可以尝试搜索最小字数的设置。 停用词 有各种语言的停用词 MySql 列表,这些词表示在搜索过程中忽略的无关紧要的词。该列表已编译到服务器中,但可以覆盖,如本手册页和文本所示: 要覆盖默认停用词列表,请设置ft_stopword_file系统变量。(请参见第5.1.4节“服务器系统变量”。)变量值应为包含停用词列表的文件的路径名,或为禁用停用词过滤的空字符串。除非给出绝对路径名以指定其他目录,否则服务器将在数据目录中查找文件。更改此变量的值或停用词文件的内容后,重新启动服务器并重建FULLTEXT索引。 一些样本查询 -- select * from testproduct SELECT * FROM testproduct WHERE MATCH(prod_name) AGAINST('score' IN BOOLEAN MODE); SELECT * FROM testproduct WHERE MATCH(prod_name) AGAINST('harpoon' IN BOOLEAN MODE); SELECT * FROM testproduct WHERE MATCH(prod_name) AGAINST('banana' IN BOOLEAN MODE); SELECT * FROM testproduct WHERE MATCH(prod_name) AGAINST('years' IN BOOLEAN MODE); 获得多个单词匹配: SELECT id,prod_name, match( prod_name ) AGAINST ( '+harpoon +article' IN BOOLEAN MODE ) AS relevance FROM testproduct ORDER BY relevance DESC 在relevance列中给出实际权重: SELECT id,prod_name, match( prod_name ) AGAINST ( '+harpoon +article' IN NATURAL LANGUAGE MODE) AS relevance FROM testproduct ORDER BY relevance DESC +------------+--------------------------------------------------------------------------------------------------------------------+--------------------+ | id | prod_name | relevance | +------------+--------------------------------------------------------------------------------------------------------------------+--------------------+ | D34595N5PF | this article about harpoons really drills into the throwing of harpoon or harpoons to those that deserve a harpoon | 3.6207125186920166 | | EEEZZ5N5PF | he has a harpoon | 1.2845110893249512 | | C04K95N5PF | threw some daggers and a harpoon | 1.2559525966644287 | |------------+------------------------------------来源:stack overflow
保持可爱mmm 2020-05-13 14:41:32 0 浏览量 回答数 0

回答

找到一篇帖子解决了这个问题,http://blog.csdn.net/asenwei/article/details/7446027   spring当中需要指定<property name="servicePort" value="2098"/>,以下为帖子内容,   前段时间写了一个全文检索服务,用的是RMI远程调用。在本机上写好后, 测试ok.但一部署到服务器上就报找不到服务。在网上找了一大通:  原因如下:      RMI除了注册端口外,其通信端口是服务器随机产生的,因此不容易穿过防火墙。  现将我在网上搜索到的解决方法公布在这里,给其它人需要的人一个方便。也给自己一个方便。  如果要扣分就扣吧。  一、普通解决:  Java代码    import java.rmi.server.*;  import java.io.*;  import java.net.*;  public class SMRMISocket extends RMISocketFactory {      public Socket createSocket(String host, int port)           throws IOException{          return new Socket(host,port);      }      public ServerSocket createServerSocket(int port)           throws IOException {          if (port == 0)              port = 2098;//不指定就随机           return new ServerSocket(port);      }  }    [java]  viewplain  copy import java.rmi.server.*;  import java.io.*;  import java.net.*;  public class SMRMISocket extends RMISocketFactory {      public Socket createSocket(String host, int port)           throws IOException{          return new Socket(host,port);      }      public ServerSocket createServerSocket(int port)           throws IOException {          if (port == 0)              port = 2098;//不指定就随机          return new ServerSocket(port);      }  }    二、 spring中    Java代码     <bean id="rmiSearchService" class="org.springframework.remoting.rmi.RmiServiceExporter">  <property name="serviceName" value="search"/><!-- 服务名称 -->  <property name="service" ref="searchService"/>  <property name="serviceInterface" value="velcro.searchengine.ISearcher"/>  <property name="registryPort" value="2098"/><!-- 端口 -->  <property name="servicePort" value="2098"/><!--不指定就随机 -->  </bean>   rmi调用存在防火墙问题的!愿闻其详,但是服务器间telnet是通的,我要怎么定位这个问题? 服务器的端口号对外开发了吗?已发。问题已解决,方案请看置顶帖。感谢关注:)
爱吃鱼的程序员 2020-06-08 17:26:08 0 浏览量 回答数 0

问题

社区系统 Icarus 1.3.0

开源协议 ZLIB 免费且商业友好,这个协议基本上和MIT相同。 特性 全局 文件上传(七牛云) 超宽屏支持 简易的移动端支持 实时在线人数 Markdown发帖和评论 ...
寒喵 2019-12-01 21:51:20 1292 浏览量 回答数 0

问题

最佳实践多语言网站?mysql

我已经在这个问题上苦苦挣扎了好几个月了,但是以前我从来没有需要探索所有可能的选择的情况。现在,我觉得该是时候了解各种可能性并创建自己的个人喜好了,以便在我即将进行的项目中使用。 首先让我勾勒出我要...
保持可爱mmm 2020-05-18 09:52:23 2 浏览量 回答数 1

云产品推荐

上海奇点人才服务相关的云产品 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务 阿里云AIoT