这就是我的文章数据在弹性搜索中的用法
id:123,
title:xyz,
keywords:"Test Example"
id:124,
title:xyzz,
keywords:"Test Example|test1"
当在前端点击关键字时,例如:'测试示例'然后我应该得到具有该关键字的文章(我应该得到两篇文章作为我的结果)。但我只获得第一篇文章作为我的结果及以下是我的映射:
"keywords":
{
"type":"string",
"index":"not_analysed"
}
如何在搜索结果中同时收到这两篇文章?谢谢
答案 0 :(得分:0)
Term Query
搜索确切的字词。这就是为什么当您搜索Test Example
时,您只得到一个结果,因为只有一条记录与Test Example
完全匹配。如果您想要两个结果,则需要使用match或query_string之类的结果。您可以使用query_string
之类的:
{
"query": {
"query_string": {
"default_field": "keywords",
"query": "Test Example*"
}
}
}
答案 1 :(得分:0)
您必须使用query_string进行查询,术语查询仅搜索确切的术语。
答案 2 :(得分:0)
您将keywords
字段设置为not_analyzed
:如果您希望搜索该字段,则应删除index
子句,如此
"keywords": {
"type":"string"
}
无论如何,使用match
查询搜索此字段将返回包含所提供查询的超集的结果:搜索test
将返回两个文档,即使该标记实际为{{1} }。
如果您可以将文档更改为此类
Test Example
您可以将原始地图与id:123,
title:xyz,
keywords:"Test Example"
id:124,
title:xyzz,
keywords: ["Test Example", "test1"]
一起使用,term query只会返回包含您正在寻找的标记的文档。
"index":"not_analysed"
实现相同结果的另一个选择是使用pattern tokenizer在{
"query": {
"term": {
"keywords": "test1"
}
}
}
字符上拆分标记字符串以实现相同的结果
|
答案 3 :(得分:0)
我已经使用以下标记器:
"split_keywords": {
"type": "pattern",
"group": "0",
"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
} ]
}
现在,当我搜索“TestExample”时,我收到了两篇文章。 非常感谢你的帮助:)