elasticsearch 弹性搜索未返回术语查询的预期结果,elasticsearch,mapping,elasticsearch,Mapping" /> elasticsearch 弹性搜索未返回术语查询的预期结果,elasticsearch,mapping,elasticsearch,Mapping" />

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
  } ]
}