代码之家  ›  专栏  ›  技术社区  ›  vishnu

Elasticsearch相关性-具有相似名称的文档

  •  0
  • vishnu  · 技术社区  · 7 年前

    “瓶子”和“瓶盖”

    当有人寻找 (搜索词),-“瓶盖”的得分应低于“红瓶”。

    1 回复  |  直到 7 年前
        1
  •  1
  •   dshockley    7 年前

    在Elasticsearch中,如果不添加更多信息,这是无法解决的。你想把“红色瓶子”排在“瓶盖”之前,因为你知道这些名字的语义信息——你知道“红色瓶子”意味着它所说的东西是“瓶子”,而“瓶盖”意味着它所说的东西是其他东西(与瓶子有关,但实际上不是瓶子)。如果你想从Elasticsearch中排名来考虑这些信息,你必须对这些信息进行索引(可能会添加一个关键字标记字段,一个带有“瓶子”,另一个带有“瓶盖”--你必须进行实验,看看什么适用于你的用例)。当然,这意味着一个人必须为每件事添加广告标签。

    然而,我怀疑你可以通过使用 unique filter . 我的猜测是,你不太关心单个标题中的术语频率(“500ml瓶子的瓶盖”不是关于瓶子的,因为“瓶子”在其中出现了两次——我认为术语频率对于这样的标题来说没有什么意义)。所以你可以这样做:

    PUT /myindex
    {
      "settings": {
        "index": {
          "number_of_shards": 1
        },
        "analysis": {
          "analyzer": {
            "uniq_analyzer": {
              "type": "custom",
              "tokenizer": "standard",
              "filter": [
                "lowercase",
                "porter_stem",
                "unique"
              ]
            }
          }
        }
      },
      "mappings": {
        "doc": {
          "properties": {
            "name": {
              "type": "text",
              "analyzer": "uniq_analyzer"
            }
          }
        }
      }
    }
    
    PUT /myindex/doc/1
    {"name": "Red coloured bottles"}
    
    PUT /myindex/doc/2
    {"name": "Bottle caps for 500ml bottle"}
    

    bottle ,你会看到分数是一样的——不是完美的,但有进步。如果您想了解分数的来源,可以使用 explain :

    POST /myindex
    {
      "explain": true,
      "query": {
        "match": 
          {"name": "bottle"}
      }
    }