elasticsearch 弹性搜索未返回术语查询的预期结果
这就是我的文章数据在弹性搜索中的外观
elasticsearch 弹性搜索未返回术语查询的预期结果,
elasticsearch,mapping,
elasticsearch,Mapping,这就是我的文章数据在弹性搜索中的外观 id:123, title:xyz, keywords:"Test Example" id:124, title:xyzz, keywords:"Test Example|test1" 当在前端单击一个关键字时,比如说:“Test example”,那么我应该得到具有该关键字的文章(我应该得到上面两篇文章作为我的结果)。但是我只得到第一篇文章作为我的结果,下面是我的映射: "keywords": { "type":"string", "index":"
id:123,
title:xyz,
keywords:"Test Example"
id:124,
title:xyzz,
keywords:"Test Example|test1"
当在前端单击一个关键字时,比如说:“Test example”,那么我应该得到具有该关键字的文章(我应该得到上面两篇文章作为我的结果)。但是我只得到第一篇文章作为我的结果,下面是我的映射:
"keywords":
{
"type":"string",
"index":"not_analysed"
}
如何在搜索结果中同时获得这两篇文章?谢谢您
术语查询
搜索准确的术语。这就是为什么当您搜索测试示例时,只会得到一个结果,因为只有一条记录与测试示例
完全匹配。如果你想要两种结果,你需要使用类似或的东西。您可以使用query\u string
如下:
{
"query": {
"query_string": {
"default_field": "keywords",
"query": "Test Example*"
}
}
}
您必须使用查询字符串进行查询,术语查询仅搜索准确的术语。您可以将关键字字段设置为未分析:如果您希望字段可搜索,您应该删除索引
子句,如下所示
"keywords": {
"type":"string"
}
无论如何,使用匹配
查询搜索此字段将返回包含所提供查询超集的结果:搜索测试
将返回两个文档,即使标记实际上是测试示例
如果你能把你的文件改成这样
id:123,
title:xyz,
keywords:"Test Example"
id:124,
title:xyzz,
keywords: ["Test Example", "test1"]
您可以将原始映射与“index”:“not_analysis”
一起使用,并且a将只返回完全包含您要查找的标记的文档
{
"query": {
"term": {
"keywords": "test1"
}
}
}
实现相同结果的另一个选项是使用分割字符|
上的标记字符串以实现相同的结果
"tokenizer": {
"split_tags": {
"type": "pattern",
"group": "-1",
"pattern": "\|"
}
}
我已将其与以下标记器一起使用:
"split_keywords": {
"type": "pattern",
"group": "0",
"pattern": "([^|]+)"
}
关键字将在管道字符处拆分(下面是示例)
现在当我搜索“TestExample”时,我得到了上面两篇文章。
非常感谢您的帮助:)我添加了这个标记器“split_tags”:{“type”:“pattern”,“group”:“0”,“pattern”:“([^ |]+)”},我正在映射中使用它(我已将索引更改为“analysis”)。它只对一个单词的关键字起作用。但我没有得到下面场景的预期结果:id:123,title:xyz,关键词:“test”id:124,title:xyz,关键词:“test-Example | test”如果我搜索“test-Example”,那么我应该只得到第二篇文章作为我的结果,但我得到两篇文章作为我的结果:(仅将split_标记添加到设置中是不够的;您还应该添加一个使用split_标记的自定义分析器。此外,在您的字段中,您应该设置“type”:“string”,“analyzer”:“split_analyzer”
。您可以使用\u analyze
API检查您的字段是否按预期进行了分析;)我添加了自定义分析器,并且正在使用拆分标记器,但我在评论中没有提到这一点(对此表示抱歉)。分析器看起来像这样的“拆分标记”:{“类型”:“自定义”,“标记器”:“拆分标记”,“过滤器”:[“text\u word\u delimiter”]}您是否尝试过elasticsearch.host:9200/yourindex/\u analyze?field=yourfield&text=Test Example | Test
?此外,模式标记器的文档提到“正则表达式应该匹配标记分隔符,而不是标记本身。”,但似乎您正在匹配标记本身-您应该将标记器更改为{“type”:“pattern”,“group”:“-1”,“pattern”:“|”}
{
"tokens" : [ {
"token" : "TestExample",
"start_offset" : 0,
"end_offset" : 12,
"type" : "word",
"position" : 1
}, {
"token" : "test",
"start_offset" : 13,
"end_offset" : 17,
"type" : "word",
"position" : 2
}, {
"token" : "1",
"start_offset" : 17,
"end_offset" : 18,
"type" : "word",
"position" : 3
}, {
"token" : "test1",
"start_offset" : 13,
"end_offset" : 18,
"type" : "word",
"position" : 3
} ]
}