Высокий результат не отображается в нечетком запросе результата Elasticsearch - PullRequest
0 голосов
/ 15 марта 2019

Привет. Я пытаюсь создать предложение "Вы имели в виду", используя нечеткий запрос в Elasticsearch. Например, когда пользователь ищет слово «applo», вместо него будет отображаться «яблоко» (потому что есть название продукта / бренда, которое содержит слово «яблоко»). Поэтому я хочу выделить слово с нечетким соответствием («яблоко») и показать его пользователю.

Это мои свойства:

 "properties": {
                "brand_name": {
                    "type": "keyword",
                    "store": true
                },
               {
                "product_name": {
                    "type": "keyword",
                    "store": true
                },
}

Это мой запрос:

var should = { "should": [
        {
          "multi_match": {
            "fields": ["product_name", "brand_name"],
            "query": "applo",
            "fuzziness": 2,
            "prefix_length": 1
          }
        },
        {
          "query_string": {
            "query": "*" + applo + "*",
            "fields": ["product_name", "brand_name"]
          }
        }
      ],
        "minimum_should_match": 1
    };

body = {
    size: 50,
    from: 0,
    query: {
      bool: should
    },
    aggs: buildAggregate(),
    "highlight": {
      "fields": {
        "brand_name": {},
        "product_name": {}
      }
    }
  };

Нечеткий запрос и запрос отлично работают и дают правильный результат. Однако в результате нет выделенного поля. Чего не хватает в моем запросе или есть что-то изменить в свойствах сопоставления?

Пример данных:

 { took: 67,   timed_out: false,   _shards: { total: 5, successful: 5,
 skipped: 0, failed: 0 },   hits: { total: 2, max_score: null, hits: [
 [Object] ] },   aggregations:    { brands:
       { doc_count_error_upper_bound: 0,
         sum_other_doc_count: 0,
         buckets: [Array] },
      minimum: { value: 1000 },
      maximum: { value: 1000 },
      values:
       { doc_count_error_upper_bound: 0,
         sum_other_doc_count: 0,
         buckets: [Array] } } }

Объект попаданий:

{ _index: 'product',
  _type: 'product',
  _id: '1',
  _score: null,
  _source:
   { 
       product_name: 'Apple Watch',
       brand_name: 'Apple'
   }
}

1 Ответ

0 голосов
/ 15 марта 2019

Давайте начнем:

  1. Ваше отображение неверно для нечеткого поиска.Вам необходимо понять разницу между text и ключевое слово типами данных.Короче говоря, ключевое слово индексируется как есть и не может измениться.Текст конвертируется в токены и больше конверсий применяется к токенам.Для более глубокого понимания процесса индексирования предлагаю начать чтение этой статьи .Тогда я предлагаю изменить ваше отображение:
"properties": {
   "brand_name": {
       "type": "text"
   },
   "product_name": {
      "type": "text"
    }
 }

После этого изменения вы потеряли возможность выполнять агрегацию в этих полях.И здесь есть мысль.Потому что: если вы включите полевые данные, тогда вы потеряете производительность, и объем памяти будет увеличен.

И для последнего пункта я предлагаю упростить ваш запрос до query_string:

{
  "query": {
     "query_string": {
       "query": "applo~1"
     }
  }
}

Читайте об этом запросе здесь .

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