使用Angular 4的Elasticsearch搜索服务

时间:2017-08-08 22:01:38

标签: angular ng-bootstrap elasticsearch-5

我很难弄清楚如何在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吗?

1 个答案:

答案 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);
}

}