Как преобразовать объект в запрос Json с помощьюasticsearch - PullRequest
0 голосов
/ 01 апреля 2019

Я работаю над поисковым приложением на основе Angular7 иasticsearchJS.В моем сервисе данных я создаю JS-файл Elaset Flexible Search из входных данных пользователя.Это хорошо работает с простым строковым запросом в this.query.Это не будет работать для сложного массива из this.selectedTopics (мои флажки).Вывод уничтожен в JSON (см. Изображение)

enter image description here

Я становлюсь обратной косой чертой в моем console.log по моему запросу (см. Изображение)

console.log(this.selectedTopics);

  // Output of selectedTopics is this:
  //  ["Lindenholz", "Sandstein"]

  this.selectedTopics.forEach( (item) => {
      this.termarray.push('{ "term": {"79_material":"' + item + '"}}');
  });

  console.log(this.termarray.join(', '));

    // Output of termarray is this:
    //
    //  [
    //      { "term": {"79_material":"Sandstein"}},
    //      { "term": {"79_material":"Lindenholz"}}
    //  ]
    // looks fine in console. But if i send the termarray to the json body it looks wrong with the backslashes.

  this.body = {
    // 'size': this.size.value, // document anzahl
    'size': '100',
    'from': '0', // page
    'query': {
      'filtered': {
        'query' : {
            'multi_match': {
                'query': this.query,
                'type': 'phrase_prefix',
                // 'fields': ['79_material', '79_technik'] // Fulltext or Category
                'fields': this.selectedCategory
            }
        },
        'filter': {
            'bool': {
                'must': [
                  this.termarray.join(', ')
                  // {'term' : { '79_material': 'holz' }},
                  // {'term' : { '79_material': 'lindenholz' }}
                ]
            }
        }
    }
    },
    // Faceten Auswahl hier und in der Searchlist. Auf content und keyword achten.
    'facets' : {
      '79_material' : {
        'terms' : {'field' : '79_material.keyword'}
     },
      '79_technik' : {
        'terms' : {'field' : '79_technik.keyword'}
    },
      '79_kuenstler' : {
        'terms' : {'field' : '79_kuenstler.content'} // neue Indexierung mit Keyword
    },
    '79_verortung' : {
      'terms' : {'field' : '79_verortung.content'} // neue Indexierung mit Keyword
  },
  },
    'sort' : [
      { '79_material' : {'order' : 'asc'}},
      '_score'
  ]
  };

enter image description here

Результат должен быть таким:

[
{'term' : { '79_material': 'holz' }},
{'term' : { '79_material': 'lindenholz' }}
]

1 Ответ

0 голосов
/ 01 апреля 2019

Вы пробовали это?

this.termarray.push({ term: { '79_material': item }});

(альтернативно:

this.termarray.push({ 'term': { '79_material': item }});
this.termarray.push({ 'term': { "79_material": item }});
this.termarray.push({ "term": { "79_material": item }});

)

UPDATE

В описании не ясно, как обрабатывается termarray, но что, если вы просто добавите элементы непосредственно в body:

let termarray = this.body.query.filter.bool.must;
this.selectedTopics.forEach( (item) => {
    termarray.push({ term: { '79_material': item }});
});

ОБНОВЛЕНИЕ 2 :

Вот скриншот из Chrome после применения UPDATE:

screenshot

Обратите внимание, что при применении JSON.stringify(body) вы получите ожидаемый результат, т. Е. Без обратной косой черты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...