当前位置: 首页 > 知识库问答 >
问题:

如果查询在引号之间,如何从elasticsearch中获得精确的文本匹配

邵博艺
2023-03-14

我使用php for binary documents(fscrawler)实现了elasticsearch。它在默认设置下工作得很好。我可以在文档中搜索我想要的单词,并得到不区分大小写的结果。然而,我现在想做精确匹配,即在当前搜索的顶部,如果查询被括在引号中,我想得到结果,只匹配查询完全…甚至区分大小写。

我的映射如下所示:

"settings": {
"number_of_shards": 1,
"index.mapping.total_fields.limit": 2000,
"analysis": {
  "analyzer": {
    "fscrawler_path": {
      "tokenizer": "fscrawler_path"
    }
  },
  "tokenizer": {
    "fscrawler_path": {
      "type": "path_hierarchy"
    }
  }
}
.
.
.
  "content": {
    "type": "text",
    "index": true
  },
    if ($q2 == '') {
    $params = [
        'index' => 'trial2',
        'body' => [
            'query' => [
                'match_phrase' => [
                        'content' => $q
                ]
            ]
        ]
    ];

    $query = $client->search($params);
    $data['q'] = $q;
}

对于完全匹配(不起作用):

    if ($q2 == '') {
        $params = [
            'index' => 'trial2',
            'body' => [
                'query' => [
                    'filter' =>[
                        'term' => [
                            'content' => $q
                        ]
                    ]
                ]
            ]
        ];

        $query = $client->search($params);
        $data['q'] = $q;
    }

内容字段是文档的主体。如何实现内容字段中特定单词或短语的精确匹配?

共有1个答案

邴英毅
2023-03-14

据我所知,您的content字段将非常大,因为许多文档可能超过2-3 MB,这是很多单词。

按照前面问题的答案,使用keyword字段进行精确匹配是没有意义的,我在前面提到使用keyword。只有当数据结构化时,才应使用关键字datatype进行精确匹配

我所理解的是,content字段是非结构化的。在这种情况下,您需要在content字段上使用空白分析器。

另外,要获得确切的短语匹配,请查看匹配短语查询。

下面是一个示例索引、文档和查询,可以满足您的用例。

PUT mycontent_index
{
  "mappings": {
    "properties": {
      "content":{
        "type":"text",
        "analyzer": "whitespace"            <----- Note this
      }
    }
  }
}
POST mycontent_index/_doc/1
{
  "content": """
      There is no pain you are receding
      A distant ship smoke on the horizon
      You are only coming through in waves
      Your lips move but I can't hear what you're saying
  """
}

POST mycontent_index/_doc/2
{
  "content": """          
      there is no pain you are receding
      a distant ship smoke on the horizon
      you are only coming through in waves
      your lips move but I can't hear what you're saying
  """
}
POST mycontent_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match_phrase": {                   <---- Note this for phrase match
            "content": "There is no pain"
          }
        }
      ]
    }
  }
}
POST mycontent_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {                          <---- Use this for token based search
            "content": "there"
          }
        }
      ]
    }
  }
}

请注意,您的响应应该是相应的。

要精确匹配一个单词,只需使用一个简单的匹配查询。

请注意,当您不指定任何分析器时,ES默认使用标准分析器,这将导致在将所有令牌存储在倒排索引中之前将它们转换为小写。但是,空白分析器不会将标记转换为小写。因此,therethere作为两个不同的标记存储在ES索引中。

我假设您知道分析和分析器的概念,如果不知道,我建议您浏览这些链接,因为这将帮助您更多地了解我所说的内容。

在了解您的需求之后,您不可能在一个字段上应用多个分析器,所以基本上您有两个选择:

选项1:使用多个索引

选项2:在映射中使用多字段,如下所示:

PUT <your_index_name>
{ 
   "mappings":{ 
      "properties":{ 
         "content":{ 
            "type":"text",                     <--- Field with standard analyzer
            "fields":{ 
               "whitespace":{ 
                  "type":"text",               <--- Field with whitespace
                  "analyzer":"whitespace"       
               }
            }
         }
      }
   }
}

希望这能有所帮助。

 类似资料:
  • 问题内容: 我使用php对二进制文档(fscrawler)实现了elasticsearch。使用默认设置就可以正常工作。我可以在文档中搜索所需的单词,并且得到的结果不区分大小写。但是,我现在要进行精确匹配,即在当前搜索的顶部,如果查询用引号引起来,我想获得仅与查询完全匹配的结果。 我的映射如下所示: 我对文档的查询如下所示: 对于完全匹配(无效): 内容字段是文档的主体。如何在内容字段中实现特定单

  • 我有一个索引(名称:“index1”)指向ElasticSearch中的多个文档。 文档的格式(json)是- 下面是映射- 我在ES查询中哪里做错了?

  • 问题内容: 我正在尝试编写一个NEST查询,该查询应基于完全匹​​配的字符串返回结果。我已经在网络上进行了研究,并且对使用术语,匹配,匹配短语有一些建议。我已经尝试了所有这些方法,但是搜索返回的结果中包含搜索字符串的一部分。例如,在我的数据库中,我有以下几行电子邮件地址: ter@gmail.com ter@hotmail.com terrance@hotmail.com 无论我是否使用: 要么

  • 问题内容: 我想在一个字段中搜索“ vision”项目,但是通过在DSL中使用match / match_phrace / term,我只得到了“ vision A”,“ vision B”,“ xx版本”,“ vision”等结果。 我想要的是精确匹配“视觉”应该获得最高分,而包含“视觉”的项目应该排在精确匹配之后。排名应该是: 我检查了Elasticsearch匹配精确术语其中识别出将“索引”

  • 问题内容: 所以我有一个字段以以下格式存储值:,例如23 / 2014、24 / 2014、12 / 2015等。 因此,如果将此字段映射为一个,则可以使用术语过滤器进行精确值搜索,如果我在该精确结构中搜索值(类似于1 / 2014、15 / 2014等),则可以正常工作,例如。 因此,使用11 /或/ 2014之类的其他内容进行搜索不会返回匹配。这可以。 但是,如果将字段定义为,则无法使用查询进

  • 问题内容: 我想获取与“ statusCode”不匹配的结果:200 为了匹配字段中的文本,您可以使用 我尝试过这样的事情: 根据:https : //www.elastic.co/guide/zh- CN/elasticsearch/reference/current/query-dsl-bool- query.html 问题答案: 试试这个