预定义术语映射

时间:2015-05-12 10:32:59

标签: mongodb full-text-search elasticsearch

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

  

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

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

我会接受MongoDB或Elasticsearch的答案。

1 个答案:

答案 0 :(得分:2)

如果你使用像这样的查询怎么办:

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

它的作用是这样的:

  • 如果该字段内容匹配"韩国"然后它收到了分数
  • 如果该字段不匹配"朝鲜"再次,它得到了一些得分提升
  • 再次,如果它不匹配" n。韩国"得到一些额外的分数。

基本上,如果匹配" korea",如果它不匹配"朝鲜"如果它不匹配" n。韩国"

例如,对于像这样的文件

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

最高得分是针对不是朝鲜的文件。