我很难弄清楚如何在Angular 4中使用Elasticsearch(5.x)。
我安装了ES JS客户端,并通过npm install --save @ types / elasticsearch安装了类型定义。
我正在尝试使用NgbBootstrap Typeahead进行自动填充。但是我一直收到此错误ERROR Error: Cannot find a differ supporting object '[object Object]' of type 'object'
所以我一直在使用formatMatches函数来格式化输入/输出,因为我的服务返回{}
而不是[]
。似乎没什么用。
formatMatches = (query: any) => query.hits.**hits**._source.suggestions || '';
第二次点击,是一个包含{“_ source”的数组:{“advice”:“suggestion_text”}
所以现在我想也许我的服务不太正确,因为我基本上使用的是与NgbBootstrap相同的HTML。
这是我的服务
@Injectable()
export class Elasticsearch {
private results: Observable<Suggestion[]>;
//private clientElasticsearch: Client;
private esClient: Client;
constructor() {
//this.clientElasticsearch = new Client({
this.esClient = new Client({
host: 'http://localhost:9200',
apiVersion: '5.x',
log: 'trace'
});
}
//public test_search(value): Observable<SearchResponse<{}>> {
public search(query): Observable<SearchResponse<{}>> {
return Observable.fromPromise(<Promise<SearchResponse<{}>>>
this.esClient.search({
index: 'query-index',
body: {
"query": {
"match_phrase_prefix": {
"suggestions": {
"query": query,
"max_expansions": 10
//"lenient": true
}
}
},
"size": 5,
"from": 0,
"_source": ["suggestions"]
}
}));
}
}
我开始认为我不必通过npm使用ES JS客户端,因为我知道js客户端是为了使用promises而构建的。我可以简单地使用像this这样的网络API吗?
答案 0 :(得分:-1)
Try this:
@Injectable()
export class QueryService {
private _esClient: Client;
private _wildCard = '*';
constructor() {
this._esClient = new Client({
host: 'http://localhost:9200',
log: 'error',
});
}
getQueryfieldclin(fieldName: string): Observable<Object[]> {
return Observable.fromPromise(
<Promise<any>> this._esClient.search({
'index': 'ft-query',
'type': 'telco',
'size': 50,
'body': {
'query': {
'bool': {
'must': [
{
'range': {
'InvoiceDate': {
'gte': '2004-01-01',
'lte': '2017-12-31'
}
}
}
],
'should': [
{
'wildcard' : { 'CLIN.keyword' : '*'}
}
], 'minimum_number_should_match': 1
}
}
},
}),
)
.map((response: SearchResponse<string>) => response.hits.hits)
.do(data => data);
}
}