Python 上的 Elasticsearch DSL 无法生成分数
Elasticsearch DSL on Python fails to generate Score
我有一个 Elasticsearch 数据库,其中有几个字段可以包含名称信息,我正在尝试像这样搜索它:
from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search
client = Elasticsearch()
s = Search(using=client, index="names")
query = 'smith'
fields = ['name1', 'name2']
results = s.query("multi_match", query=query, fields=fields, fuzziness='AUTO')
for hit in results.scan():
print(hit.meta.score)
结果是:
None
None
None
...
但是,如果我手动构造它:
results = client.search(index="names",
body={"size": 100, "query":{
"multi_match": {
"query": query, "fields": fields, "fuzziness": 'AUTO'
}
}
})
我的结果是:
{'_index': 'names', '_type': 'Name1', '_id': '1MtYSW4BXryTHXwQ1xBS', '_score': 14.226202, '_source': {...}
{'_index': 'names', '_type': 'Name1', '_id': 'N8tZSW4BXryTHXwQHBfw', '_score': 14.226202, '_source': {...}
{'_index': 'names', '_type': 'Name1', '_id': '8MtZSW4BXryTHXwQeR-i', '_score': 14.226202, '_source': {...}
如果可能我更愿意使用elasticsearch-dsl,但我需要分数信息。
试试这样:
results = s.query("multi_match", query=query, fields=fields, fuzziness='AUTO')
for hit in results["hits"]["hits"]:
print(hit._score)
试试这个:
from elasticsearch_dsl.query import MultiMatch
from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search
client = Elasticsearch()
s = Search(using=client, index="names")
query = 'smith'
fields = ['name1', 'name2']
query_multi =
MultiMatch(query=query,fields=fields,fuzziness='AUTO')
r = s.query(query_multi)
results = r.execute()
for hit in results:
print(hit.meta.score)
第一版代码不等同于第二版代码。第一个版本没有执行查询,而是使用 Scroll API (elasticsearch.helpers.scan).
Search.query()
方法构建或扩展搜索对象,而不是向 elasticsearch 发送查询。所以以下代码行具有误导性:
results = s.query("multi_match", query=query, fields=fields, fuzziness='AUTO')
应该是这样的:
# execute() added at the end
results = s.query("multi_match", query=query, fields=fields, fuzziness='AUTO').execute()
# scan() removed
for hit in results:
print(hit.meta.score)
试试这个:
s = s.params(preserve_order=True).sort("_score")
那么scan
可以returnscore
.
默认情况下,扫描将使用 ['_doc']
进行填充排序,这就是为什么它不会 return 得分的原因。
我有一个 Elasticsearch 数据库,其中有几个字段可以包含名称信息,我正在尝试像这样搜索它:
from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search
client = Elasticsearch()
s = Search(using=client, index="names")
query = 'smith'
fields = ['name1', 'name2']
results = s.query("multi_match", query=query, fields=fields, fuzziness='AUTO')
for hit in results.scan():
print(hit.meta.score)
结果是:
None
None
None
...
但是,如果我手动构造它:
results = client.search(index="names",
body={"size": 100, "query":{
"multi_match": {
"query": query, "fields": fields, "fuzziness": 'AUTO'
}
}
})
我的结果是:
{'_index': 'names', '_type': 'Name1', '_id': '1MtYSW4BXryTHXwQ1xBS', '_score': 14.226202, '_source': {...}
{'_index': 'names', '_type': 'Name1', '_id': 'N8tZSW4BXryTHXwQHBfw', '_score': 14.226202, '_source': {...}
{'_index': 'names', '_type': 'Name1', '_id': '8MtZSW4BXryTHXwQeR-i', '_score': 14.226202, '_source': {...}
如果可能我更愿意使用elasticsearch-dsl,但我需要分数信息。
试试这样:
results = s.query("multi_match", query=query, fields=fields, fuzziness='AUTO')
for hit in results["hits"]["hits"]:
print(hit._score)
试试这个:
from elasticsearch_dsl.query import MultiMatch
from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search
client = Elasticsearch()
s = Search(using=client, index="names")
query = 'smith'
fields = ['name1', 'name2']
query_multi =
MultiMatch(query=query,fields=fields,fuzziness='AUTO')
r = s.query(query_multi)
results = r.execute()
for hit in results:
print(hit.meta.score)
第一版代码不等同于第二版代码。第一个版本没有执行查询,而是使用 Scroll API (elasticsearch.helpers.scan).
Search.query()
方法构建或扩展搜索对象,而不是向 elasticsearch 发送查询。所以以下代码行具有误导性:
results = s.query("multi_match", query=query, fields=fields, fuzziness='AUTO')
应该是这样的:
# execute() added at the end
results = s.query("multi_match", query=query, fields=fields, fuzziness='AUTO').execute()
# scan() removed
for hit in results:
print(hit.meta.score)
试试这个:
s = s.params(preserve_order=True).sort("_score")
那么scan
可以returnscore
.
默认情况下,扫描将使用 ['_doc']
进行填充排序,这就是为什么它不会 return 得分的原因。