【问题标题】:Predefined Term Mapping预定义术语映射
【发布时间】:2015-07-23 04:09:50
【问题描述】:

我还没有使用 Elasticsearch,所以请原谅不好的描述。我想知道是否可以将 Elasticsearch 配置为执行以下操作 - 我在 MongoDB 中遇到了一些问题,因为全文搜索功能似乎有点限制。

这是我的问题 - 当我搜索术语 Korea 时,我没有 希望它与文档中的North KoreaN. Korea 匹配。

假设搜索Korea 大约是South Korea。这显然与同义词不同,因为它是相反的。 South Korea 的短语搜索在这里是不可能的,因为它不适用于我的问题。这可能吗?

我将接受 MongoDB 或 Elasticsearch 的答案。

【问题讨论】:

  • “这是我的问题 - 当我搜索韩国这个词时,我不希望它与文档中的朝鲜或北朝鲜匹配。”但你期望它返回什么?
  • 我希望该词不匹配“朝鲜”或“北朝鲜”,因此结果应该返回更多关于韩国的信息。
  • 我个人项目的问题是,当人们通常谈论韩国时,他们指的是三星、LG、K-Pop 等。我的应用程序返回了很多关于核武器的内容:S
  • 你可以让“韩国”在 ES 中的“韩国”更重
  • @Sammaye 你是怎么做到的?

标签: mongodb full-text-search elasticsearch


【解决方案1】:

如果你使用这样的查询会怎样:

{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "some_field": "korea"
          }
        },
        {
          "query_string": {
            "query": "-some_field:(\"north korea\")"
          }
        },
        {
          "query_string": {
            "query": "-some_field:(\"n. korea\")"
          }
        }
      ]
    }
  }
}

它的作用是这样的:

  • 如果该字段内容与“korea”匹配,则它会收到分数
  • 如果该字段再次与“北韩”不匹配,则分数会有所提升
  • 同样,如果它与“n. korea”不匹配,则会获得一些额外的分数。

基本上,如果匹配“korea”,如果不匹配“north korea”,如果不匹配“n.korea”,则分数会增加。

例如,对于这样的文档

POST /my_index/test/1
{
  "text": "North Korea"
}
POST /my_index/test/2
{
  "text": "Korea"
}
POST /my_index/test/3
{
  "text": "N. Korea"
}
POST /my_index/test/4
{
  "text": "South Korea"
}

上面的查询将返回:

  "hits": [
     {
        "_index": "korea",
        "_type": "test",
        "_id": "2",
        "_score": 1.4471208,
        "_source": {
           "text": "Korea"
        }
     },
     {
        "_index": "korea",
        "_type": "test",
        "_id": "4",
        "_score": 1.4227209,
        "_source": {
           "text": "South Korea"
        }
     },
     {
        "_index": "korea",
        "_type": "test",
        "_id": "1",
        "_score": 0.48779577,
        "_source": {
           "text": "North Korea"
        }
     },
     {
        "_index": "korea",
        "_type": "test",
        "_id": "3",
        "_score": 0.48779577,
        "_source": {
           "text": "N. Korea"
        }
     }
  ]

与朝鲜无关的文件得分最高。

【讨论】:

  • 这很酷——你认为在 MongoDB 中会发生类似的事情吗?
  • 我对MongoDB一无所知。
  • @AndreiStefan 只是好奇,可以使用 must_not(保留应该)bool 查询而不是查询字符串来编写相同的查询吗?
  • @jrao77 是的,你可以这样做。并使用"type" : "phrase" 进行match 查询。
猜你喜欢
  • 1970-01-01
  • 2020-12-28
  • 2014-07-27
  • 1970-01-01
  • 2018-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多