Запрос Flexiblesearch возвращает больше, чем хиты - PullRequest
0 голосов
/ 02 марта 2019

мой файл Python индексации ниже
должно быть семь попаданий, соответствующих запросу на основе реальных данных, но при этом он продолжает давать 10 результатов.потому что параметр размера по умолчанию равен 10. Можно ли дать ему столько же, сколько количество попаданий, а не размер?или я должен предвидеть размер и постоянно вводить его в запрос?

результат:

{

может быть связан скак я его проиндексировал?idk, почему общее число попаданий составляет 26639. Оно должно совпадать как 7.

from elasticsearch import  helpers, Elasticsearch
from datetime import datetime
import csv
import json

es = Elasticsearch()

with open('result.csv', encoding='utf-8') as f:
    reader = csv.DictReader(f)
    helpers.bulk(es, reader, index='hscate', doc_type='my-type')

res = es.search(index = 'hscate',
            doc_type = 'my-type',
           # size ='1000',
            #from_=0,
                body = {
                'query': {     
                    'match' : {
                         'name' : '추성훈의 코몽트 기모본딩바지 3+1종_총 4종'
                    }
                }
            })
print(len(res['hits']['hits']))
with open('mycsvfile.csv', 'w',encoding='utf-8',newline='') as f:  # Just use 'w' mode in 3.x
    header_present  = False
    for doc in res['hits']['hits']:
        my_dict = doc['_source'] 
        if not header_present:
            w = csv.DictWriter(f, my_dict.keys())
            w.writeheader()
            header_present = True
        w.writerow(my_dict)

Ответы [ 2 ]

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

Основываясь на обсуждении, которое мы имеем в качестве комментариев, теперь я могу понять, что вы имели в виду и в чем заключается ваша настоящая проблема.

Когда вы используете значения по умолчанию вasticsearch ,asticsearch анализирует ваш текст с помощью стандартный анализатор , который в основном разбивает ваш текст на токены.При поиске в этом поле с запросом на совпадение применяется тот же самый процесс анализа.Это означает, что текст вашего запроса также разбит на токены.Запрос match запускает «или» на всех сгенерированных токенах.

В следующем примере, который можно скопировать и вставить в консоли разработчика Kibana, показано, что:

DELETE test
PUT test 
PUT test/_doc/1
{
  "name": "추성훈의 코몽트 기모본딩바지 3+1종_총 4종"
}
PUT test/_doc/2
{
  "name": "추성훈의 기모본딩바지 4종"
}
GET test/_search
{
  "query": {
    "match": {
      "name": "추성훈의 코몽트 기모본딩바지 3+1종_총 4종"
    }
  }
}

Он дает следующеерезультат:

{
  "took" : 12,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 2,
    "max_score" : 1.7260926,
    "hits" : [
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.7260926,
        "_source" : {
          "name" : "추성훈의 코몽트 기모본딩바지 3+1종_총 4종"
        }
      },
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.8630463,
        "_source" : {
          "name" : "추성훈의 기모본딩바지 4종"
        }
      }
    ]
  }
}

Если вы не определили какой-либо анализатор в настройках индекса, то, вероятно ,asticsearch сгенерировал подполе .keyword, которое не анализируется.Вы можете запросить его следующим образом:

GET test/_search
{
  "query": {
    "term": {
      "name.keyword": "추성훈의 코몽트 기모본딩바지 3+1종_총 4종"
    }
  }
}

Теперь это дает только точные совпадения:

{
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.2876821,
    "hits" : [
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.2876821,
        "_source" : {
          "name" : "추성훈의 코몽트 기모본딩바지 3+1종_총 4종"
        }
      }
    ]
  }
}

Если вы знаете, что вы никогда не собираетесь запускать полнотекстовый поиск, а только точное совпадение, товам не нужно агрегировать или сортировать по полю name, тогда вы можете определить свой индекс следующим образом:

DELETE test
PUT test 
{
  "mappings": {
    "_doc": {
      "properties": {
        "name": {
          "type": "text",
          "analyzer": "keyword"
        }
      }
    }
  }
}
PUT test/_doc/1
{
  "name": "추성훈의 코몽트 기모본딩바지 3+1종_총 4종"
}
PUT test/_doc/2
{
  "name": "추성훈의 기모본딩바지 4종"
}
GET test/_search
{
  "query": {
    "term": {
      "name": "추성훈의 코몽트 기모본딩바지 3+1종_총 4종"
    }
  }
}

Это также дает один единственный результат и требует меньше места на диске, чем поведение по умолчанию.

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

Как вы подозреваете, я думаю, чтоasticsearch просто выдаст вам 10 результатов, в зависимости от ранга, который они получают при сопоставлении их в ваших данных.

Попробуйте:

body = {
    'from': 0,
    'size': 1,
    'query': {
        'bool': {
            'must': [
                {
                    'match': {
                        'Category' : 'category name',
                    }
                },
                {
                    'match' : {
                        'name' : 'product name'
                    }
                }
            ]
        }
    }
}

Источник: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-from-size.html

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