为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

神不在的星期二 2021-11-23 20:11:57
我的索引 python 文件下面应该有 7 个匹配基于真实数据的查询,但它一直产生 10 个结果。因为默认大小参数是 10 有没有办法让它产生与点击次数一样多的次数而不是大小?还是我必须预测大小并一直将其放入查询中?结果:也许与我如何索引它有关?idk 为什么总命中数是 26639。它应该像 7 一样匹配。from elasticsearch import  helpers, Elasticsearchfrom datetime import datetimeimport csvimport jsones = 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 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

根据我们作为评论的讨论,我现在可以理解您的意思以及您的实际问题是什么。


当您在 elasticsearch 中使用默认值时,elasticsearch 正在使用标准分析器分析您的文本,该分析器基本上将您的文本拆分为标记。当您使用匹配查询在该字段上进行搜索时,将应用相同的分析过程。这意味着您的查询文本也被分解为标记。该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종"

        }

      }

    ]

  }

}

如果您没有在索引设置中定义任何分析器,那么可能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 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종"

    }

  }

}

这也给出了一个结果,并且比默认行为需要更少的磁盘空间。


查看完整回答
反对 回复 2021-11-23
?
守候你守候我

TA贡献1802条经验 获得超10个赞

正如您所怀疑的那样,我认为 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


查看完整回答
反对 回复 2021-11-23
  • 2 回答
  • 0 关注
  • 233 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信