gpt4 book ai didi

elasticsearch - Elasticsearch如何匹配字段 token 是查询 token 的子集的文档

转载 作者:行者123 更新时间:2023-12-02 23:00:38 25 4
gpt4 key购买 nike

我有一个关键字/关键短语字段,我使用标准分析器将其标记化。如果要搜索的短语中包含该字段的所有标记,我希望此字段匹配。

例如,如果字段值为“veni,vidi,vici”,而搜索短语为“Ceaser veni,vidi,vici”,则我希望此搜索短语匹配,但搜索短语“veni,vidi”不匹配。

我还需要“vidi,veni,vici”(很奇怪!)进行匹配。因此,术语的位置和顺序并不是很重要。我认为,词组匹配对我不太有用。

对于此特定示例,我可以将“ bool(boolean) 查询”与“minimum_should_match”参数一起使用,但这并不是我真正想要的,因为匹配的最小值应与搜索词组中标记的比率/数量有关。

最佳答案

纯ES解决方案将像这样。您将需要两个请求。

1)首先,您需要通过analyze api传递用户查询以获取所有搜索 token 。

curl -XGET 'localhost:9200/_analyze' -d '
{
"analyzer" : "standard",
"text" : "Ceaser veni,vidi,vici"
}'

您将获得4个 token stopr,veni,vidi,vici。您需要将这些标记作为数组传递给下一个 search请求。

2)我们需要搜索 token 为搜索 token 的 子集的文档。
{
"query": {
"filtered": {
"filter": {
"bool": {
"must": [
{
"query": {
"match": {
"title": "Ceaser veni,vidi,vici"
}
}
},
{
"script": {
"script": "if(search_tokens.containsAll(doc['title'].values)){return true;}",
"params": {
"search_tokens": [
"ceaser",
"veni",
"vidi",
"vici"
]
}
}
}
]
}
}
}
}
}

过滤器中第一个 match query的工作是缩小应在其上运行脚本的文档的范围。 containsAll方法将检查文档 token 是否为搜索 token 的 sublist。这会很慢,但是可以使用您当前的设置来完成工作。您可以做的一大改进是将 token 存储为数组,以便 doc['title'].values可以替换为该字段,从而改善脚本。

希望这可以帮助!

关于elasticsearch - Elasticsearch如何匹配字段 token 是查询 token 的子集的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35082284/

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