【问题标题】:elasticsearch - ngram, custom sorting, irrelevant resultselasticsearch - ngram,自定义排序,不相关的结果
【发布时间】:2021-08-02 17:20:30
【问题描述】:

我想通过elasticsearch实现搜索。 我在搜索字段中使用“edge_ngram”。

搜索时我得到不相关的结果(例如,我搜索“abcd”并得到“abc...”结果),所以我想使用“min_score”过滤器,问题是这个过滤器不起作用如果我对结果使用自定义“排序”(然后我得到“分数”:null)。

即使使用自定义“排序”,我也必须使最小分数过滤器工作,或者让我的“分析器”不会给我不相关的结果(对于“abcd”,我希望结果是“abcd*”,仅此而已) .

映射:

'search_by' => [
    'type' => 'text',
     'analyzer' => 'autocomplete'
]

分析器:

"analysis" => [
    "analyzer" => [
        "autocomplete" => [
            "tokenizer" => "autocomplete",

        ],
    ],
    "tokenizer" => [
        "autocomplete" => [
            "type" => "edge_ngram",
            "min_gram" => 3,
            "max_gram" => 10,
            "token_chars" => [
                "letter"
            ]
        ]
    ] 
    ...
]

查询:

"query": {
    "bool": {
        "must": [
            {
                "bool": {
                    "should": [
                        {
                            "match": {
                                "search_by": {
                                    "query": "abcd"
                                }
                            }
                        }
                    ]
                }
            }
        ],
        "must_not": [],
        "should": []
    }
},
"min_score": 2,
"from": 0,
"size": 24,
"sort": [
    {
        "order_by": "desc"
    }
]

【问题讨论】:

  • 问题不在于评分,而在于您编制索引和进行查询的方式。请随时分享您的索引映射和查询,我们将向您展示如何实现您的期望
  • 好的,我已经添加了映射和查询。

标签: elasticsearch


【解决方案1】:

问题在于您使用相同的分析器进行索引和搜索时间。这是一个常见的错误。所以你应该做的就是这样:

'search_by' => [
    'type' => 'text',
     'analyzer' => 'autocomplete',
     'search_analyzer' => 'standard'        <--- add this
]

【讨论】:

  • 如果我对“搜索分析器”使用“标准”,那么我的查询仅适用于完全匹配 - 3 个字母后不匹配。
  • 在搜索时使用标准分析器会对您有所帮助。您可以使用prefix 查询,然后您将能够匹配从相同数量的字符(abcd)到以相同字符开头的更长字符串(abcdefgh)的任何内容
  • 酷,很高兴它有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-14
  • 2017-12-21
  • 1970-01-01
相关资源
最近更新 更多