【问题标题】:Elastic Search: Match Phrase giving unwanted results弹性搜索:匹配短语给出不需要的结果
【发布时间】:2015-12-29 09:55:31
【问题描述】:

我有一个包含以下数据的文档:

Hello World and 

bmw Master World

Hello

所以文档包含如上所示的 3 行,我已将文档索引到我的弹性搜索服务器。 我正在使用以下 match_phrase 查询来搜索确切的短语:“World Hello”。

:query=>{ :match_phrase=>{ :text=> "World Hello" } }

令人惊讶的是,它返回了上面的文档。

需要注意的是,本文档不包含短语“World Hello”。但是第二行以“World”结尾,第三行以“Hello”开头。 这就是上述文档匹配查询的原因吗?

【问题讨论】:

  • 所以,它是一个 3 行文件?你能展示你的映射吗?但是,我确定这是因为对于索引,它只是由分隔符分隔的一大行单词

标签: apache elasticsearch lucene


【解决方案1】:

您可能想了解一下analysis 的工作原理。

还可以看看phrase matching 的这个描述。短语中的术语不必按照查询的确切顺序出现,第一个只需要出现在第二个之前。由于在"world" 之后有一个"hello",因此该文档与您的查询匹配。

还要注意,这里使用了standard analyzer,用于索引文档和分析查询,因为没有指定其他分析器。如果您愿意,您可以自定义此行为。

作为一个简单的例子,我创建了一个简单的索引:

PUT /test_index

然后索引您的文档(换行符转义):

PUT /test_index/doc/1
{
    "doc_text": "Hello World and \n\nbmw Master World\n\nHello"
}

然后索引另一个删除了最后一个“Hello”:

PUT /test_index/doc/2
{
    "doc_text": "Hello World and \n\nbmw Master World"
}

现在,如果我运行您的查询,则只返回第一个文档:

POST /test_index/_search
{
   "query": {
      "match_phrase": {
         "doc_text": "World Hello"
      }
   }
}  
...
{
   "took": 2,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "failed": 0
   },
   "hits": {
      "total": 1,
      "max_score": 0.4459011,
      "hits": [
         {
            "_index": "test_index",
            "_type": "doc",
            "_id": "1",
            "_score": 0.4459011,
            "_source": {
               "doc_text": "Hello World and \n\nbmw Master World\n\nHello"
            }
         }
      ]
   }
}

您可以使用term vectors 向自己证明为什么会发生这种情况。我不会在这里详细介绍,但如果您愿意,可以使用以下代码进行调查:

http://sense.qbox.io/gist/3ee955b8389d1b36ea56788654955c519e2bb429

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    • 2020-08-22
    相关资源
    最近更新 更多