弹性搜索未返回术语查询的预期结果

时间:2016-02-22 21:35:47

标签: elasticsearch mapping

这就是我的文章数据在弹性搜索中的用法

id:123,
title:xyz,
keywords:"Test Example"


id:124,
title:xyzz,
keywords:"Test Example|test1"

当在前端点击关键字时,例如:'测试示例'然后我应该得到具有该关键字的文章(我应该得到两篇文章作为我的结果)。但我只获得第一篇文章作为我的结果及以下是我的映射:

"keywords":
{
"type":"string",
"index":"not_analysed"
}

如何在搜索结果中同时收到这两篇文章?谢谢

4 个答案:

答案 0 :(得分:0)

Term Query搜索确切的字词。这就是为什么当您搜索Test Example时,您只得到一个结果,因为只有一条记录与Test Example完全匹配。如果您想要两个结果,则需要使用matchquery_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”时,我收到了两篇文章。 非常感谢你的帮助:)