1

我要求能够搜索完整或带前缀的句子。我正在使用的 UI 库(反应式搜索)以这种方式生成查询:

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

我期待它返回结果,例如。 Louis George Maurice Adolphe (Roche) 但不仅仅是包含部分术语的记录,例如LouisGeorge

目前,我有这样的代码,但如果我使用完整的单词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"
        }
      }
    }
  }
}

对上述任何指导表示赞赏。谢谢。

4

2 回答 2

0

根本问题源于您正在应用空格去除器这一事实。这实际上意味着当您摄取文档时:

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,您可能需要重新考虑您的规范化器。

@Ninja 的答案在您搜索时失败George Maurice Adolphe,即没有前缀交集。

于 2020-09-15T14:54:09.800 回答
0

您没有使用前缀查询,因此没有得到前缀搜索词的结果,我使用了相同的映射和示例文档,但更改了提供预期结果的搜索查询

索引映射

{
    "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)"
                }
            }
        ]

于 2020-09-15T14:46:01.077 回答