gpt4 book ai didi

elasticsearch - 与 Elastic Search 6 和 php ClientBuilder 完全匹配

转载 作者:行者123 更新时间:2023-12-03 01:31:00 55 4
gpt4 key购买 nike

我正在为一个 ecomm 站点构建一个 Elasticsearch 驱动的分层导航模块。一切都很好,我可以从外部来源获取选项并显示它们。选择它们也可以,但我遇到了一个问题,其中一个过滤器选项有这些选择;

FINISHES:

Finished (1)

Semi-Finished (16)

Semi Finished (1)

显然,应该整理带和不带连字符的 2 个变体,但是当我将以下内容应用于我的收藏时,暂时忽略这一点;
$client = $this->clientBuilder;
$params .... etc
$params['body']['query']['bool']['must'][] = ['match_phrase' => [$split[0] => "$selected"]];
$response = $client->search($params);

其中 $split[0] 是 'FINISHES' 的 Elasticsearch 字段引用,$selected 是选择的值。如果您单击任何选项,我将返回所有 18 条记录。毫无疑问,因为它们都包含正在搜索的单词之一“完成”。

怎样才能只搜索确切的术语?我试过用\- 转义连字符,但这没有帮助,我也试过检查搜索的词是否有空格或连字符,并试图强行将它们添加到“must_not”,但这也不起作用;
if(!$space) {
$params['body']['query']['bool']['must_not'][] = ['match' => [$split[0] => ' ']];
}
if(!$hyphen) {
$params['body']['query']['bool']['must_not'][] = ['match' => [$split[0] => '\\-']];
}

最佳答案

默认情况下,标准分析器应用于所有字段。所以在你的情况下,Semi-Finishedkeyword并且倒排索引将包含两个单词 semifinished ,所以每次你寻找完成时它都匹配,因为标准分析器会在连字符上打破它。

POST _analyze
{
"analyzer": "standard",
"text": ["Semi-Finished"]
}

##Result
{
"tokens" : [
{
"token" : "semi",
"start_offset" : 0,
"end_offset" : 4,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "finished",
"start_offset" : 5,
"end_offset" : 13,
"type" : "<ALPHANUM>",
"position" : 1
}
]
}
.keyword搜索原始文本,即未分析。在您的情况下, fieldname.keyword应该管用。
POST _analyze
{
"analyzer": "keyword",
"text": ["Semi-Finished"]
}

##Result
{
"tokens" : [
{
"token" : "Semi-Finished",
"start_offset" : 0,
"end_offset" : 13,
"type" : "word",
"position" : 0
}
]
}

关于elasticsearch - 与 Elastic Search 6 和 php ClientBuilder 完全匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55939470/

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