我有一个这样的索引:
"mappings": {
"_doc": {
"properties": {
"key_words": {"type": "text", "analyzer": "english", "search_analyzer": "english", "index": True},
"name": {"type": "text", "index": False},
}
}
此索引包含主题名称和关键字,应进行匹配以使该主题与某些文本相关。因此,我需要使用长文本按主题索引进行搜索,并找到所有具有完全匹配项的主题。例如,如果我在索引中包含以下主题:
{"name": "a", "key_words": "World cup"}
{"name": "b", "key_words": "Gaming cup"}
{"name": "c", "key_words": "Cup"}
和文字:
The World Championship, some country win the Cup on tennis!
由于文本中存在文档中的所有关键字,因此我想使用“文本”进行查询,该文本仅与“ a”和“ c”文档匹配。
有人可以帮助我建立此查询吗? ES版本:6.8
答案 0 :(得分:1)
感谢Jaspreet Chahal在评论中的链接,我在那里找到了解决方案。 我更改了映射,使其开始看起来像这样:
{
"mappings": {
"_doc": {
"properties": {
"key_words": {"type": "text", "analyzer": "english", "search_analyzer": "english", "index": True, "fielddata": True},
"name": {"type": "text", "index": False},
}
}
}
}
,我需要在两次调用中进行搜索,首先是分析文本并生成 令牌
analyzed = await el.indices.analyze(body={"analyzer": "english", "text": "The World Championship, some country win the Cup on tennis!"})
然后是具有脚本条件的呼叫
{
"query": {
"bool": {
"must": [{
"match": {
"key_words": desc
}}],
"filter": {
"script": {
"script": {
"source": "if(params.search_tokens.containsAll(doc['key_words'].values)){return true;}",
"lang": "painless",
"params": {
"search_tokens": [an['token'] for an in analyzed['tokens']]
}
}
}
}
}
},
"_source": ["_id"]
}