Elasticsearch:分数不正确

时间:2017-12-24 00:08:36

标签: elasticsearch

搜索多个单词的行为不太清楚。我正在运行以下查询:

{
        "score": 7.925287,
        "text": "Yappies",
    },
    {
        "score": 7.925287,
        "text": "YourPetBuddy",
    },
    {
        "score": 7.925287,
        "text": "YourDog",
    },

    {
        "score": 6.270683,
        "text": "Testcat",
    },

但搜索结果对我来说很奇怪:

BASE_SETTINGS = {
    'settings': {
        "number_of_shards": 1,
        "number_of_replicas": 0,
        'analysis': {

            'filter': {
                'autocomplete_filter': {
                    'type': 'edge_ngram',
                    'min_gram': 1,
                    'max_gram': 16
                }
            },

            'analyzer': {
                'autocomplete': {
                    'type': 'custom',
                    'tokenizer': "standard",
                    'filter': [
                        'lowercase',
                        'autocomplete_filter'
                    ]
                }
            }
        }
    }
}

我使用以下设置:

'properties': {
                        field['name']: {
                            'type': 'text',
                            'analyzer': 'autocomplete',
                            'search_analyzer': 'standard'
                        } for field in MAPPING_FIELDS[index]['fields']
                    }

Testcat不应该得分更高吗?因为它与搜索字符串有更大的匹配

更新:对于搜索,我已经使用标准搜索分析器

#set($greet = $input.params('greet'))
#set($name = $input.params('username'))
{
#if($greet != "")
    "greet": "$greet"
    #if($name != "")
    ,
    #end
#end
#if($name != "")
    "name": "$name"
#end
}

如何将最高分数分配给最大前缀?

1 个答案:

答案 0 :(得分:0)

我假设你的索引过程和搜索查询使用相同的分析器。通过索引,它为每个文档为该字段创建16克:

Testcat: t te tes ...
Yappies: y ya yap...

如果在搜索过程中不使用其他分析器,则对每个标记的查询都会发生同样的事情(由于标准标记化器而在空间上分割):

Testcat: t te tes ...
y: y 

由于令牌数量庞大,很多文档都会受到影响我在这里猜测y是您在该字段的索引中的更独特的标记因此,这些文件更具相关性。

尝试在不包含edge_ngram过滤器的搜索过程中使用其他分析器,如下所述:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-analyzer.html