猿问

elasticsearch 查询返回的次数超过点击次数

我的索引 python 文件下面
应该有 7 个匹配基于真实数据的查询,但它一直产生 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)


神不在的星期二
浏览 234回答 2
2回答

眼眸繁星

根据我们作为评论的讨论,我现在可以理解您的意思以及您的实际问题是什么。当您在 elasticsearch 中使用默认值时,elasticsearch 正在使用标准分析器分析您的文本,该分析器基本上将您的文本拆分为标记。当您使用匹配查询在该字段上进行搜索时,将应用相同的分析过程。这意味着您的查询文本也被分解为标记。该match查询运行“或”所有生成的标记。您可以在 Kibana 开发者控制台中复制和粘贴的以下示例显示:DELETE testPUT 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종"        }      }    ]  }}如果您没有在索引设置中定义任何分析器,那么可能elasticsearch 生成了一个.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 testPUT 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종"    }  }}这也给出了一个结果,并且比默认行为需要更少的磁盘空间。

守候你守候我

正如您所怀疑的那样,我认为 elasticsearch 会根据它们在您的数据中匹配它们时产生的排名,为您简单地生成 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
随时随地看视频慕课网APP

相关分类

Python
我要回答