GitHub的地址:
https://github.com/elastic/elasticsearch-js
小问题
- elasticsearch查询结果只显示一万
我们在进行查询的时候,应该选择
scroll
的方式进行查询,我还看到了一个,用排序搜索的,我用的就是排序的搜索
首先,使用elasticsearch-head将对应的索引进行关闭,之后对索引进行设置。我们对目标索引发送put
请求,请求的地址示例:http://localhost:9200/aaa/_settings
,参数:{ "index" : { "max_result_window" : 500000}}
,设置完成后,重新打开就可以了,这样结果字段就会显示完整的了
快速开始
首先,初始化它
const { Client } = require('@elastic/elasticsearch')
const client = new Client({ node: 'http://localhost:9200' })
您可以通过回调函数,或者Promise来使用
// promise API
const result = await client.search({
index: 'my-index',
body: { foo: 'bar' }
})
// callback API
client.search({
index: 'my-index',
body: { foo: 'bar' }
}, (err, result) => {
if (err) console.log(err)
})
每个** API调用返回的**值形成如下形式:
{
body: object | boolean
statusCode: number
headers: object
warnings: [string]
meta: object
}
让我们看一个完整的例子!
'use strict'
const { Client } = require('@elastic/elasticsearch')
const client = new Client({ node: 'http://localhost:9200' })
async function run () {
// 让我们从索引一些数据开始
await client.index({
// 索引的名称
index: 'game-of-thrones',
// 如果您使用的是Elasticsearch≤6,取消对这一行的注释
// type: '_doc',
body: {
character: 'Ned Stark',
quote: 'Winter is coming.'
}
})
await client.index({
index: 'game-of-thrones',
// 如果您使用的是Elasticsearch≤6,取消对这一行的注释
// type: '_doc',
body: {
character: 'Daenerys Targaryen',
quote: 'I am the blood of the dragon.'
}
})
await client.index({
index: 'game-of-thrones',
// 如果您使用的是Elasticsearch≤6,取消对这一行的注释
// type: '_doc',
body: {
character: 'Tyrion Lannister',
quote: 'A mind needs books like a sword needs a whetstone.'
}
})
// 这里我们强制执行索引刷新,否则在随后的搜索中不会得到任何结果
await client.indices.refresh({ index: 'game-of-thrones' })
// 开始搜索
const { body } = await client.search({
index: 'game-of-thrones',
// 如果您使用的是Elasticsearch≤6,取消对这一行的注释
// type: '_doc',
body: {
query: {
match: { quote: 'winter' }
}
}
})
console.log(body.hits.hits)
}
run().catch(console.log)
在TS中使用
定义一个接口
export interface IEsResult<T> {
body: {
/**
* 耗时,毫秒
*/
took: number,
timed_out: boolean,
/**
* 结果数据
*/
hits: {
/**
* 结果集合
*/
hits: T[],
/**
* 计数
*/
total: {
/**
* 关系
*/
relation: "eq",
/**
* 一共多少数据
*/
value: number
}
},
},
/**
* 单页大小
*/
size?: number;
/**
* 总页数
*/
pages?: number;
}
获取数据
/**
* 获取ES查询出来的数据,这里使用的是对name进行类似于sql中的like "%aaa%" 的查询方式,其他的查询方式,后面再补上
* @param index 索引
* @param keyword 关键词
* @param pagenum 页码
* @param size 单页大小
*/
async getEsData(index: string, keyword: any, pagenum: number, size: number) {
// 获取数据
const result: IEsResult<any> = await this.searcClient.search({
index,
body: {
track_total_hits: true,
query: {
bool: {
must: [{
"query_string": {
"default_field": "name",
"query": "*" + name+ "*"
}
}],
must_not: [],
should: []
}
},
search_after: [(pagenum - 1) * size],
size: size,
sort: [
{"_id": "asc"}
]
}
});
result.size = size;
result.pages = Math.ceil(result.body.hits.total.value / size);
return result;
}
新增数据
在搜索引擎里面不叫新增数据,叫做创建索引,使用的是index的方法
await client.index({
index: 'game-of-thrones',
// type: '_doc', // uncomment this line if you are using Elasticsearch ≤ 6
body: {
character: 'Daenerys Targaryen',
quote: 'I am the blood of the dragon.'
}
})
删除操作
client.delete({
id: string,
index: string,
type: string,
wait_for_active_shards: string,
refresh: 'true' | 'false' | 'wait_for',
routing: string,
timeout: string,
if_seq_no: number,
if_primary_term: number,
version: number,
version_type: 'internal' | 'external' | 'external_gte' | 'force'
})
更新操作
在经过查询和删除的操作后,基本上已经可以知道,ES在node里面基本使用,主要是对body对象的属性进行扩展,比如我要更新单个文档:
const result: any = await this.searcClient.update({
id,
index,
body: {
doc: params,
// script: "ctx._source.city = \'北京\'"
}
});
在API中,还有一个是根据条件进行批量更新,它是这样的:
// 条件更新是不需要id的
const result: any = await this.searcClient.updateByQuery({
index,
body: {
query: {
bool: {
must: [{
"query_string": {
"default_field": "jyfw.keyword",
"query": "*" + keyword + "*"
}
}],
}
},
script: {
// 执行的脚本语言
lang: "painless",
inline: "ctx._source.city = \'北京\'"
}
}
});
网友评论