php - 在Elasticsearch中将没有空格的单词与带有空格的文本进行匹配

标签 php elasticsearch elasticsearch-query elasticsearch-analyzers

问题标题有点误导,但我不知道如何正确放置,但这是我的情况

在 flex 搜索的产品记录标题中,我有一个单词删除(请参阅中间的空格)。现在我需要将它与 waterwipes 匹配。因为之间没有空格,所以查询waterwipes的结果为零。以下是 flex 搜索中的必须匹配查询(我在这里使用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",
             ],
          ],   
        ],
      ],
   ];

并且该 Realm 的分析仪是“英语”。如何匹配“水删除布”之类的单词?

最佳答案

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

请查看用于删除空格的索引设置:{

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

之后,您可以使用ES analyze API确认其生成 token ,该 token 将与您的搜索查询 token 匹配。

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
        }
    ]
}

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

关于php - 在Elasticsearch中将没有空格的单词与带有空格的文本进行匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60486670/

相关文章:

elasticsearch - Elasticsearch-从结构中删除字段

performance - 对于产品属性的索引,更多的短文本字段与更少的字段以及更多的单词

elasticsearch - 是否可以在Elastic Search中使用简单查询字符串查询来设置TYPE参数

php - 如果未重定向,则重定向页面

javascript - 如何使用AJAX调用包含的php文件?

c# - 从QueryContainer删除重复的UserID(字段)

elasticsearch - 在 Elasticsearch 中通过 id 获取上一个/下一个搜索结果的通用方法

elasticsearch - Elasticsearch 聚合和复杂查询

php - 一个查询插入多行多列

php - 在 mysql 上使用 AES 加密,最短 URL