带有前缀搜索的elasticsearch关键字用法

iqxoj9l9  于 2021-06-14  发布在  ElasticSearch
关注(0)|答案(2)|浏览(401)

我有一个要求,能够搜索一个完整的句子或前缀。我使用的ui库(React式搜索)以以下方式生成查询:

"simple_query_string": {
  "query": "\"Louis George Maurice Adolphe\"",
  "fields": [
    "field1",
    "field2",    
    "field3"
  ],
  "default_operator": "or"
}

我希望它能为例如返回结果。 Louis George Maurice Adolphe (Roche) 但不仅仅是包含部分项的记录,比如 Louis 或者 George 目前,我有这样的代码,但它只带来了记录,如果我用完整的词搜索 Louis George Maurice Adolphe (Roche) 但不是前缀 Louis George Maurice Adolphe .

{
  "settings": {
    "analysis": {
      "char_filter": {
        "space_remover": {
          "type": "mapping",
          "mappings": [
            "\\u0020=>"
          ]
        }
      },
      "normalizer": {
        "lower_case_normalizer": {
          "type": "custom",
          "char_filter": [
            "space_remover"
          ],
          "filter": [
            "lowercase"
          ]
        }
      }
    }
  },
  "mappings": {
    "_doc": {
      "properties": {
        "field3": {
          "type": "keyword",
          "normalizer": "lower_case_normalizer"
        }
      }
    }
  }
}

如有任何上述指导,我们将不胜感激。谢谢。

von4xj4u

von4xj4u1#

潜在的问题源于您正在应用一个空格移除器。这实际上意味着,当您摄取文档时:

GET your_index_name/_analyze
{
  "text": "Louis George Maurice Adolphe (Roche)",
  "field": "field3"
}

它们被索引为

{
  "tokens" : [
    {
      "token" : "louisgeorgemauriceadolphe(roche)",
      "start_offset" : 0,
      "end_offset" : 36,
      "type" : "word",
      "position" : 0
    }
  ]
}

所以如果你想用 simple_string ,您可能需要重新考虑规格化器。
@当你搜索时,忍者的答案失败了 George Maurice Adolphe ,即没有前缀交叉。

3okqufwl

3okqufwl2#

您没有使用前缀查询,因此没有得到前缀搜索项的结果,我使用了相同的Map和示例文档,但更改了搜索查询,从而得到预期的结果
索引Map

{
    "settings": {
        "analysis": {
            "char_filter": {
                "space_remover": {
                    "type": "mapping",
                    "mappings": [
                        "\\u0020=>"
                    ]
                }
            },
            "normalizer": {
                "lower_case_normalizer": {
                    "type": "custom",
                    "char_filter": [
                        "space_remover"
                    ],
                    "filter": [
                        "lowercase"
                    ]
                }
            }
        }
    },
    "mappings": {
        "properties": {
            "field3": {
                "type": "keyword",
                "normalizer": "lower_case_normalizer"
            }
        }
    }
}

索引样本文档

{
   "field3" : "Louis George Maurice Adolphe (Roche)"
}

搜索查询

{
  "query": {
    "prefix": {
     "field3": {
        "value": "Louis George Maurice Adolphe"
      }
    }
  }
}

搜索结果

"hits": [
            {
                "_index": "normal",
                "_type": "_doc",
                "_id": "1",
                "_score": 1.0,
                "_source": {
                    "field3": "Louis George Maurice Adolphe (Roche)"
                }
            }
        ]

相关问题