gpt4 book ai didi

elasticsearch - Elasticsearch 建议返回零结果

转载 作者:行者123 更新时间:2023-12-03 01:37:11 26 4
gpt4 key购买 nike

我正在尝试使用elasticsearch_dsl python库设置ElasticSearch。我已经能够设置索引,并且能够使用.filter()方法进行搜索,但是我无法使.suggest方法正常工作。

我正在尝试使用completion映射类型和suggest查询方法,因为这将用于自动完成字段(在Elastic的文档中推荐)。

我是新手,所以我想我缺少了一些东西。
任何指导将不胜感激!

到目前为止我做了什么

我没有找到完全符合我想要的教程,但是我通读了ElasticSearch.com和elasticsearch_dsl上的文档,并看了一些示例
herehere

PS:我在Heroku上使用Searchbox Elasticsearch

索引/映射设置:

# imports [...]

edge_ngram_analyzer = analyzer(
'edge_ngram_analyzer',
type='custom',
tokenizer='standard',
filter=[
'lowercase',
token_filter(
'edge_ngram_filter', type='edgeNGram',
min_gram=1, max_gram=20
)
]
)

class DocumentIndex(ElasticDocument):
title = Text()
title_suggest = Completion(
analyzer=edge_ngram_analyzer,
)
class Index:
name = 'documents-index'

# [...] Initialize index
# [...] Upload Documents (5,000 documents)
# DocumentIndex.init()
# [DocumentIndex(**doc).save() for doc in mydocs]

映射输出:

这是Web控制台中显示的映射:
 {
"documents-index": {
"mappings": {
"doc": {
"properties": {
"title": {
"type": "text"
},
"title_suggest": {
"type": "completion",
"analyzer": "edge_ngram_analyzer",
"search_analyzer": "standard",
"preserve_separators": true,
"preserve_position_increments": true,
"max_input_length": 50
}
}
}
}
}
}

尝试搜寻

验证索引是否存在:
>>> search = Search(index='documents-index')
>>> search.count() # Returns correct amount of documents
5000
>>> [doc for doc in search.scan()][:3]
>>> [<Hit(documents-index/doc/1): ...} ...

测试搜索-作品:
>>> query = search.filter('match', title='class')
>>> query.execute()
>>> result.hits
<Response: [<Hit(documents-in [ ... ]
>>> len(result.hits)
10
>>> query.to_dict() # see query payload
{
"query":{
"bool":{
"filter":[
{
"fuzzy":{
"title":"class"
}
}
]
}
}
}

失败的部分

我无法使用任何 .suggest()方法。
注意:
*我正在关注官方 library docs

测试建议:
>>> query = search.suggest(
'title-suggestions',
'class',
completion={
'field': 'title_suggest',
'fuzzy': True
})
>>> query.execute()
<Response: {}>
>>> query.to_dict() # see query payload
{
"suggest": {
"title-suggestions": {
"text": "class",
"completion": { "field": "title_suggest" }
}
}
}

我还尝试了下面的代码,显然还有许多不同类型的查询和值,但结果相似。 (注意 .filter()总是得到预期的结果)。
>>> query = search.suggest(
'title-suggestions',
'class',
term=dict(field='title'))
>>> query.to_dict() # see query payload
{
"suggest": {
"title-suggestions": {
"text": "class",
"term": {
"field": "title"
}
}
}
}
>>> query.execute()
<Response: {}>

更新资料

根据Honza的建议,我将 title_suggest映射更新为仅Completion,没有自定义分析器。我还删除了索引并从头开始重新索引
class DocumentIndex(ElasticDocument):
title = Text()
title_suggest = Completion()
class Index:
name = 'documents-index'

不幸的是,问题仍然存在。这是更多测试:

验证 title_suggest是否正确索引
>>> search = Search(index='documents-index)
>>> search.index('documents-index').count()
23369
>>> [d for d in search.scan()][0].title
'AnalyticalGrid Property'
>>> [d for d in search.scan()][0].title_suggest
'AnalyticalGrid Property'

再次尝试搜索:
>>> len(search.filter('term', title='class').execute().hits)
10
>>> search.filter('term', title_suggest='Class').execute().hits
[]
>>> search.suggest('suggestions', 'class', completion={'field':
'title_suggest'}).execute().hits
[]

验证映射:
>>> pprint(index.get_mapping())
{
"documents-index": {
"mappings": {
"doc": {
"properties": {
"title": { "type": "text" },
"title_suggest": {
"analyzer": "simple",
"max_input_length": 50,
"preserve_position_increments": True,
"preserve_separators": True,
"type": "completion"
}
}
}
}
}
}

最佳答案

对于完成字段,您不想使用ngram分析器。 completion字段将自动为所有前缀编制索引并针对前缀查询进行优化,因此您要进行两次工作并使系统混乱。从空的completion字段开始,然后从那里开始。

关于elasticsearch - Elasticsearch 建议返回零结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51436113/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com