如何用elasticsearch 高可用5.2实现全文索引

主题信息(必填)
主题描述(最多限制在50个字符)
申请人信息(必填)
申请信息已提交审核,请注意查收邮件,我们会尽快给您反馈。
如有疑问,请联系
傻丫头和高科技产物小心翼翼的初恋
如今的编程是一场程序员和上帝的竞赛,程序员要开发出更大更好、傻瓜都会用到软件。而上帝在努力创造出更大更傻的傻瓜。目前为止,上帝是赢的。个人网站:。个人QQ群:、
个人大数据技术博客:
人生得意须尽欢,莫使金樽空对月。elasticsearch(15)
获取多个文档
通过查询API删除文档
通过查询API更新文档
所有的CRUD API都是单个索引的api。索引只接收一个索引名称,或者一个指向某个具体索引的索引别名。
下面的操作都可以通过kibana中的dev-tool来完成,如下图
PUT twitter/tweet/1
"user" : "kimchy",
"post_date" : "T14:12:12",
"message" : "trying out Elasticsearch"
响应结果:
"_shards" : {
"total" : 2,
"failed" : 0,
"successful" : 2
"_index" : "twitter",
"_type" : "tweet",
"_id" : "1",
"_version" : 1,
"created" : true,
"result" : created
动态创建索引
当我们在创建一个文档的时候,elasticsearch或默认帮我们创建索引和类型。索引类型的模式非常灵活,当我们新增一个字段的时候,会默认帮我们添加一个类型映射。(基本数据类型可以采用这个方法)
我们能够关闭索引的自动创建,我们只需要在配置文件(elasticsearch.yaml)中修改如下配置(集群中的所有配置必须保持一致):
action.auto_create_index : false
当然我们也能够关闭类型的自动创建,也只需要增加一个配置即可:
ndex.mapper.dynamic : false
其中,更为灵活的是,我们可以通过一个匹配模式来设定自定义的自动索引创建,比如:
action.auto_create_index :+aaa*,-bbb*,+ccc*,-(+表示允许,-表示不允许,表示前缀后缀匹配)
创建索引的java实现
因为版本的升级,maven引入依赖的jar包也发生了变化,我们需要引入下面两个pom:
&org.elasticsearch.client&
&transport&
&org.elasticsearch&
&elasticsearch&
创建client
TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));
我们对比发现,我们之前都是直接创建TransportClient的示例,但是这个类在5.2版本就变成一个抽象类。所以只能示例它的子类PreBuiltTransportClient。
如果我们想创建一个文档,elasticsearch给我们提供了四种方式来构建一个文档的途径:
手动拼接一个json字符串
使用map来添加内容,然后将map转换成json
使用第三方json工具包,如jackson将对应的bean转换成json
使用elasticsearch内置的XContentFactory来构建json
下面是四种方式的具体实现
public void setUp() throws UnknownHostException {
TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));
public void testUseJsonStr() {
String json = "{" +
"\"user\":\"kimchy\"," +
"\"postDate\":\"\"," +
"\"message\":\"trying out Elasticsearch\"" +
client.prepareIndex("twitter", "tweet", "1")
.setSource(json)
public void testUseMap(){
Map&String, Object& json = new HashMap&String, Object&();
json.put("user","kimchy");
json.put("postDate",new Date());
json.put("message","trying out Elasticsearch");
client.prepareIndex("twitter", "tweet", "2")
.setSource(json)
public void
testUseXContentFactory() throws IOException {
IndexResponse response = client.prepareIndex("twitter", "tweet", "3")
.setSource(
XContentFactory.jsonBuilder()
.startObject()
.field("user", "kimchy")
.field("postDate", new Date())
.field("message", "trying out Elasticsearch")
.endObject()
public void testUseJackson() throws JsonProcessingException {
Tweet tweet = new Tweet("kimchy",new Date(),"trying out Elasticsearch");
ObjectMapper mapper = new ObjectMapper();
byte[] json = mapper.writeValueAsBytes(tweet);
client.prepareIndex("twitter", "tweet", "4")
.setSource(json)
class Tweet{
private Date postD
public String getUser() {
public void setUser(String user) {
this.user =
public Date getPostDate() {
return postD
public void setPostDate(Date postDate) {
this.postDate = postD
public String getMessage() {
public void setMessage(String message) {
this.message =
public Tweet(String user, Date postDate, String message) {
this.user =
this.postDate = postD
this.message =
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:52205次
排名:千里之外
原创:18篇Elasticsearch精确索引VS全文索引 - 简书
Elasticsearch精确索引VS全文索引
在ES中的数据可以分为两类:精确值(exact values)以及全文(full text)。
精确值:例如日期类型date,若date其有两个值:与2014,那么这两个值不相等。又例如字符串类型foo与Foo不相等。
全文:通常是人类语言写的文本,例如一段tweet信息、email的内容等。
精确值很容易被索引:一个值要么相当要么不等。 索引全文值就需要很多功夫。例如我们不仅要想:这个文档符合我们的查询吗?还要想:这个文档有多符合我们的查询?换句话说就是:这个文档跟我们的查询关联大吗?我们很少精确的去匹配整个全文,我们最想要的是去匹配全文文本的内部信息。除此,我们还希望搜索能够理解我们的意图:例如
如果你搜索UK,我们需要包含United Kingdom的文本也会被匹配。 如果你搜索jump,那么包含jumped,jumps,jumping,更甚者leap的文本会被匹配。
为了更方便的进行全文索引,ES首先要先分析文本,然后使用分析过的文本去创建倒序索引。
建立倒序索引的过程
例如:如果我们有两个文档,每一个文档有一个content字段,包含的内容如下:
1.The quick brown fox jumped over the lazy dog2.Quick brown foxes leap over lazy dogs in summer
CharcterFilters
字符过滤器能够去除HTML标记,或者转换"&"为"and"。没有特殊字符,因此不需要CharacterFilters特殊处理。
Tokenizer将content分割成单独的词(称为terms or tokens),创建一个所有terms的列表,然后罗列每一个term出现的文档。此过程称为tokenization。如下图:
倒序索引.png
ES使用倒序索引来加速全文索引。一个倒序索引由两部分组成:
在文档中出现的所有不同的词;
对每个词,它所出现的文档的列表。
如果我们想要搜索 quick brown,我们仅仅只需要找每一个term出现的文档即可。如下图:
每一个文档都匹配到了,但是第一个比第二个要匹配的多。如果我们使用一个简单的相似性算法仅仅只计算匹配的数量,那么我们可以称第一个文档要比第二个匹配的好(与我们的查询更有关联)。
Token Filters
但是现在的倒序索引有一些问题:
Quick与quick是两个不同的term,但是搜索的用户会认为它们应该是一样的term才是合理的。fox和foxes,dog和dogs是一样的词根,应该列为同一个term。 jumped和leap虽然词根不一样,但是意义却相同。
如果改善了上面的问题,那么倒序索引应该如下图:
Paste_Image.png
每个词都通过所有标记过滤(token filters),它可以修改词(例如将"Quick"转为小写),去掉词(例如停用词像"a"、"and"、"the"等等),或者增加词(例如同义词像"jump"和"leap")但是此时如果用户搜索Quick还会失败,因为term不含精确值Quick。但是,如果我们对QueryString使用与上述改善步骤相同的策略,那么用户搜索的Quick将会被转换为quick,此过程称为normalization。那么将会成功匹配。 对content的处理tokenization和normalization称为analysis过程。ES有很多种内置的analyzer处理这些。
分布式框架、大数据、机器学习
github: /jacksu问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
我的一个elasticsearch服务器是上创建了两个索引,但是,我想在搜索的时候指定在某一个索引下搜索,该怎么设置,或者是搜索语句怎么写?现在搜索会将两个索引下的结果都拿到
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
数据浏览,查本查询,复合查询都可以指定索引名称进行查询如果你仅权是想查看数据,去装个sql插件,可以像查询sql一样查询es
同步到新浪微博
分享到微博?
你好!看起来你挺喜欢这个内容,但是你还没有注册帐号。 当你创建了帐号,我们能准确地追踪你关注的问题,在有新答案或内容的时候收到网页和邮件通知。还能直接向作者咨询更多细节。如果上面的内容有帮助,记得点赞 (????)? 表示感谢。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
扫扫下载 App

我要回帖

更多关于 elasticsearch的使用 的文章

 

随机推荐