Elasticsearch查询以非严格方式从不同字段进行搜索

问题描述 投票:1回答:1

我对elasticsearch比较陌生,一直在python中使用elasticsearch。我所拥有的是csv格式的人们数据,我已经将其转换为json并添加到了Elasticsearch索引中。字段如下:

'Last Name (Legal Name)', 
'First Name', 
'Middle Name', 
'Other Last Name', 
'Business Mailing Address City Name', 
'Business Mailing Address State Name',
'Business Practice Location Address City Name', 
'Business Practice Location Address State Name', 
'Authorized Official Last Name', 
'Authorized Official First Name', 
'Authorized Official Middle Name', 
'Authorized Official Title or Position'

我想在查询中输入的内容类似于“名称城市”。例如,“克林顿·亚当斯·汉密尔顿”,其中克林顿·亚当斯是名称,汉密尔顿是城市。在大多数情况下,我将不确定哪个名字或姓氏,因此我需要从所有字段中进行匹配。

我到目前为止使用的是这样的:

"query":{
                "query_string":{
                    "fields": ['Last Name (Legal Name)', 'First Name', 'Middle Name', 
                             'Other Last Name', 'Business Mailing Address City Name', 
                             'Business Mailing Address State Name',
                             'Business Practice Location Address City Name', 'Business Practice                            
                              Location Address State Name', 
                             'Authorized Official Last Name', 'Authorized Official First Name', 
                             'Authorized Official Middle Name', 
                             'Authorized Official Title or Position'],
                    "query": "(Clinton) AND (Adams) AND (Hamilton)",
                    }
                }

如果我从数据库中搜索确切的名称和城市,但如果我在名称中有拼写错误,或者在某些名称中缩写了名字,则以下查询会很好地工作,它不会产生预期的结果。例如,如果查询类似于“克林顿·汉密尔顿”,它将与任何文档都不匹配。我不能使用OR运算符,因为有多个名字相似的人,因此查询的所有部分-名字/姓氏和城市都很重要。我希望查询从索引中获取最相关的记录。

我尽力解释了这种情况。无论如何,请随时询问是否有任何不清楚的地方。感谢您的建议。谢谢。

elasticsearch elastic-stack querydsl elasticsearch-dsl
1个回答
0
投票

首先,您应该尝试多重匹配查询,尤其是适合您的用例的cross_field类型。 Documentation here

它将把所有搜索到的字段作为一个混合字段处理。

但是如果您将运算符保持为“ AND”,则对“ Clinton A Hamilton”的查询将与“ Clinton Adams / Hamilton”文档不匹配。我认为您应该选择标准的OR运算符。它将为您提供第一个相关的文档。完全匹配先匹配,部分匹配后匹配。

如果您确定很多用户会使用小写形式作为名字,则应考虑创建一个特殊的分析器来索引小写形式。

这是独立索引中的示例:

PUT diminutive
{
  "settings": {
    "analysis": {
      "filter": {
        "diminutive": {
          "type": "edge_ngram",
          "min_gram": 1,
          "max_gram": 3
        }
      }, 
      "analyzer": {
        "diminutive": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "asciifolding",
            "diminutive"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "firstname": {
        "type": "text",
        "analyzer": "diminutive",
        "search_analyzer": "standard"
      }
    }
  }
}

然后您可以在'First Name'的字段中使用小型分析器(请参阅文档here,并在多重匹配查询中添加子字段。

可能要处理的信息/概念很多,但我认为这应该是您的用例的良好起点。

© www.soinside.com 2019 - 2024. All rights reserved.