0

问题标题有点误导,但我不知道如何正确表达,但这是我的场景

我在弹性搜索中的产品记录标题中有一个单词Water Wipes(请参阅中间的空格)。现在我需要将它与waterwipes相匹配。因为两者之间没有空格,所以查询waterwipes的结果为零。以下是 Elastic 搜索中的必须匹配查询(我这里使用的是 PHP)

 $mustConditions = [
   [
      "nested" => [
          "path"  => "name",
          "query" => [
             "multi_match" => [
                "query"            => (string)$query,
                "fields"           => ['name.en^3', 'name.ar^3'],
                "zero_terms_query" => "all",
                "fuzziness"        => "auto",
                "operator"         => "AND",
             ],
          ],   
        ],
      ],
   ];

该领域的分析仪是“英语”。我如何匹配诸如Water Wipes for waterwipes 之类的词

4

1 回答 1

1

您需要删除产品标题中的空格并将其编入索引,然后您可以查询该单词。

请参阅删除空格的索引设置:{

    "settings": {
        "analysis": {
            "analyzer": {
                "my_analyzer": {
                    "tokenizer": "standard",
                    "char_filter": [
                        "replace_whitespace"
                    ]
                }
            },
            "char_filter": {
                "replace_whitespace": {
                    "type": "mapping",
                    "mappings": [
                        "\\u0020=>"
                    ]
                }
            }
        }
    }
}

在此之后,您可以使用ES 分析 API来确认其生成的令牌将匹配您的搜索查询令牌。

POST _analyze

{
    "text": "Water wipes",
    "analyzer" : "my_analyzer"
}

{
    "tokens": [
        {
            "token": "Waterwipes", --> Notice whitespace is removed
            "start_offset": 0,
            "end_offset": 7,
            "type": "<ALPHANUM>",
            "position": 0
        }
    ]
}

建议:您应该将这些空格删除的标记存储在另一个title类似的字段中,titlewospaces并在其上应用上面的自定义分析器并在这两个字段上进行搜索以获得更好的结果。此外,您应该检查Explain API以查看您的查询生成哪些标记以及它如何与索引标记匹配。

于 2020-03-02T10:38:09.967 回答