Поисковый сервис Elasticsearch с Angular 4

Мне трудно понять, как использовать Elasticsearch (5.x) с Angular 4.

Я установил клиент ES JS через npm, а также установил определения типов через 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": {"suggestions": "suggestion_text"}

Итак, теперь я думаю, что, возможно, мой сервис не совсем правильный, потому что я в основном использую тот же HTML, что и NgbBootstrap.

вот мой сервис

    @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"]
      }
    }));
  }
}

Я начинаю думать, что мне не обязательно использовать клиент ES JS через npm, потому что я знаю, что клиент js создан для работы с промисами. Могу ли я просто использовать веб-API, например это ?


person user3125823    schedule 08.08.2017    source источник
comment
Было ли когда-нибудь решение для этого?   -  person Andrew Lobban    schedule 12.10.2017
comment
Вы поняли это, можете ли вы поделиться какой-либо идеей, если да? @user3125823   -  person Gavishiddappa Gadagi    schedule 17.01.2018


Ответы (1)


Попробуй это:

@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);
}

}

person Jan Bennett    schedule 03.02.2018