弹性搜索未给出确切的结果python

时间:2018-09-26 15:08:03

标签: python python-3.x mongodb elasticsearch elastic-stack

我正在使用匹配词组查询在ES中查找。但我注意到返回的结果不合适。 代码-

      res = es.search(index=('indice_1'),

               body = {
    "_source":["content"],

    "query": {
        "match_phrase":{
        "content":"xyz abc"
        }}}

   ,
size=500,
scroll='60s')

我没有记录内容的位置- “嗨,我叫isxyz abc。”和“嘿wassupxyz abc。生活怎么样”

使用正则表达式在mongodb中进行类似的搜索也将同时获得两条记录。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

如果您未指定分析仪,则默认情况下使用standard。它将执行基于语法的标记化。因此,您对短语“ hi my name isxyz abc”的称呼。将会类似于[hi, my, name, isxyz, abc],而match_phrase正在寻找彼此相邻的术语[xyz, abc](除非您指定slop)。

您可以使用其他分析器,也可以修改查询。如果您使用match查询,则它将与术语“ abc”匹配。如果要使短语匹配,则需要使用其他分析器。 NGrams应该适合您。

这是一个例子:

PUT test_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "ngram",
          "min_gram": 3,
          "max_gram": 3,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    }
  }, 
  "mappings": {
    "_doc": {
      "properties": {
        "content": {
          "type": "text",
          "analyzer": "my_analyzer"
        }
      }
    }
  }
}

PUT test_index/_doc/1
{
  "content": "hi my name isxyz abc."
}

PUT test_index/_doc/2
{
  "content": "hey wassupxyz abc. how is life"
}

POST test_index/_doc/_search
{
  "query": {
    "match_phrase": {
      "content": "xyz abc"
    }
  }
}

这导致找到两个文档。

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 0.5753642,
    "hits": [
      {
        "_index": "test_index",
        "_type": "_doc",
        "_id": "2",
        "_score": 0.5753642,
        "_source": {
          "content": "hey wassupxyz abc. how is life"
        }
      },
      {
        "_index": "test_index",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.5753642,
        "_source": {
          "content": "hi my name isxyz abc."
        }
      }
    ]
  }
}

编辑: 如果您要进行wildcard查询,则可以使用standard分析器。您在注释中指定的用例将像这样添加:

PUT test_index/_doc/3
{
  "content": "RegionLasit Pant0Q00B000001KBQ1SAO00"
}

您可以使用wildcard进行查询:

POST test_index/_doc/_search
{
  "query": {
    "wildcard": {
      "content.keyword": {
        "value": "*Lasit Pant*"
      }
    }
  }
}

基本上,您正在进行没有nGram分析器的子字符串搜索。您的查询短语将仅为"*<my search terms>*"。我仍然建议您调查nGrams

答案 1 :(得分:0)

您还可以使用type参数设置查询中的词组

 res = es.search(index=('indice_1'),

               body = {
    "_source":["content"],

    "query": {
        "query":"xyz abc"
        },
        type:"phrase"}

   ,
size=500,
scroll='60s')