OpenSearch [Elasticsearch]查找存在于text中的文档



我正在使用OpenSearch,并且我有一个包含几个练习名称的大输入文本。我想从输入文本中提取这些练习名称,并在我的OpenSearch索引中搜索与这些名称匹配的文档。

输入文本可以是任何格式,并且包含各种字符,例如小写字母或大写字母、数字和特殊字符。输入文本中的练习名不能保证以大写字母开头或遵循任何特定模式。下面是一个输入文本的例子:

I will make a good 10 push-ups and Dumbbell Deficit Push-up

在索引我有:

[
{
"id": 2,
"name": "Ankle Circles"
},
{
"id": 3,
"name": "Barbell Deep Squat"
},
{
"id": 10,
"name": "Push-ups"
},
{
"id": 11,
"name": "Sit-up"
},
{
"id": 12,
"name": "Air Squats"
},
{
"id": 13,
"name": "Dumbbell Deficit Push-up"
},
{
"id": 14,
"name": "Pretzel Stretch"
},
{
"id": 15,
"name": "Cobra Stretch"
},
{
"id": 20,
"name": "Push-ups with Elevated Feet"
}...
]

Here my Search Request:

SearchResponse<ExerciseOSDto> searchResponse = openSearchClient.search(
s -> s.index("exercises")
.query(new Query.Builder().match(
new MatchQuery.Builder()
.field("name")
.query(new FieldValue.Builder()
.stringValue(payload.getText()).build())
.operator(Operator.Or) 
.build())
.build()), ExerciseOSDto.class);

但是从这个例子中,我有所有的练习(向上/向上/推)。

从输入文本,我想得到练习id -1013岁和

从输入文本中提取这些练习名称并在OpenSearch中执行搜索的最佳方法是什么?

任何帮助或指导将不胜感激!

您可以使用自定义分析器来达到目的

这里我创建了一个分析器,包含基本的标记器和标记过滤器

PUT exercises
{
"settings": {
"analysis": {
"analyzer": {
"exercise_analyzer": {
"tokenizer": "whitespace",
"filter": ["lowercase"]
}
}
}
},
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "exercise_analyzer"
}
}
}
}

插入数据后,可以执行匹配查询(与您提供的代码逻辑相同)

GET exercises/_search
{
"query": {
"match": {
"name": "I will make a good 10 push-ups and Dumbbell Deficit Push-up"
}
}
}

但是要指出的是,按照这种方法你仍然会得到一些不完全符合你要求的文档。例如,本例中的Push-ups with Elevated Feet

如果仅仅依靠全文,这是很难实现的。在Elasticsearch/Opensearch上搜索

我认为简单的方法是应用额外的过滤器逻辑客户端从Elasticsearch/Opensearch获得搜索结果后

# input_str represent the input text
# results represent the exercises name you got from opensearch
final_results = [r for r in results if lower(r) in lower(input_str)]

让我知道,如果我错过了你的观点,或任何你认为它是不工作。谢谢你!

相关内容

  • 没有找到相关文章

最新更新