【问题标题】:Matching search phrase occurrence to boolean field value将搜索短语匹配到布尔字段值
【发布时间】:2021-07-08 10:21:07
【问题描述】:

我正在寻找一种方法来创建可以匹配布尔字段值的基于文本的查询。

举例来说——我的查询可能是“红地毯人工”或“人工红地毯”,我有布尔字段映射为artificial: true/false 的文档。使用这些短语,我需要匹配具有 artificial: true 的文档。


这是存储在索引中的数据:

[
  {
    "name": "Fast car",
    "artificial": true
  },
  {
    "name": "Red carpet",
    "artificial": true
  },
  {
    "name": "Green carpet of grass",
    "artificial": false
  },
  {
    "name": "Lovely bunny",
    "artificial": false
  },
  {
    "name": "Big house",
    "artificial": true
  },
  {
    "name": "Green plant",
    "artificial": false
  }
]

现在我有用户输入的搜索短语,例如:

  • “人造地毯”
  • “地毯(人造)”
  • “地毯 - 人造”

我需要构造查询,当输入上述短语时总是返回:

  {
    "name": "Red carpet",
    "artificial": true
  }

但是当用户进入时:

  • “地毯”

它实际上会返回:

  {
    "name": "Green carpet of grass",
    "artificial": false
  }

(或者两个“地毯”组成的文件都更容易实现。)

问题是我在这里需要搜索短语标记化,因为“人工”可以用不同的方式命名。

“人工”是我的关键字,不会改变。


Elasticsearch 中是否有某种机制或某种工作流程来实现这一点?也许将artificial: (bool) true/false 重新映射到artificial: (keyword) artificial/null 或其他什么?那么查询会是什么样子呢?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    我最终使用了名为 Runtime mapping fields 的新 7.11 Elasticsearch 功能。

    基于布尔字段创建新字段,该字段将真/假转换为该字段的关键字表示而不是空字符串。然后 - 使用“术语”查询。

    {
      "runtime_mappings": {
        "myfield_keyword": {
          "type": "keyword",
          "script": {
            "source": "emit(doc['myfield'].value ? 'value' : '')"
          }
        }
      },
      "query": {
        "bool": {
          "should": [
            {
              "terms": {
                "boost": 2,
                "myfield_keyword": [
                  "search",
                  "phrase",
                  "tokenized",
                  "manually"
                ]
              }
            },
    // ...
    

    【讨论】:

      猜你喜欢
      • 2011-11-21
      • 1970-01-01
      • 2021-10-19
      • 2018-09-08
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      • 2014-11-20
      • 1970-01-01
      相关资源
      最近更新 更多