【问题标题】:elasticsearch mapping with numeric token带有数字标记的弹性搜索映射
【发布时间】:2020-06-28 03:21:28
【问题描述】:

我有下面的映射,它工作正常

{
  "settings": {
    "index": {
      "number_of_shards": "5",
      "number_of_replicas": "0",
      "analysis": {
        "filter": {
          "stemmer_plural_portugues": {
            "name": "minimal_portuguese",
            "stopwords" : ["http", "https", "ftp", "www"],
            "type": "stemmer"
          },
          
          
            "synonym_filter": {
            "type": "synonym",
            "lenient": true,
            "synonyms_path": "analysis/synonym.txt",
            "updateable" : true

          },
          
       
          "shingle_filter": {
            "type": "shingle",
            "min_shingle_size": 2,
            "max_shingle_size": 3
          }

        },
        
        "analyzer": {
          "analyzer_customizado": {
            "filter": [
              "lowercase",
              "stemmer_plural_portugues",
              "asciifolding",
              "synonym_filter",
              "shingle_filter"
              
            ],
            "tokenizer": "lowercase"
          }
        }

      }
    }
  },
  "mappings": {
      "properties": {

        "id": {
         "type": "long"
        },
         "data": {
          "type": "date"
        },
         "quebrado": {
          "type": "byte"
          
        },
         "pgrk": {
           "type":  "integer" 
        },
         "url_length": {
           "type":  "integer" 
        },
        "title": {
          "analyzer": "analyzer_customizado",
          "type": "text",
          "fields": {
            "keyword": {
              "ignore_above": 256,
              "type": "keyword"
            }
          }
        },
        "description": {
        "analyzer": "analyzer_customizado",
          "type": "text",
          "fields": {
            "keyword": {
              "ignore_above": 256,
              "type": "keyword"
            }
          }
        },
        "url": {
          "analyzer": "analyzer_customizado",
          "type": "text",
          "fields": {
            "keyword": {
              "ignore_above": 256,
              "type": "keyword"
            }
          }
        }
      }
    }
  }

我在下面插入文档

{
    "title": "rocket 1960",
    "description": "space",
    "url": "www.nasa.com"
}

如果我使用AND运算符执行下面的查询,它会正常找到文档,因为搜索到的所有单词都存在于文档中。

{
    "from": 0,
    "size": 10,
    
    "query": {
      
            
                "multi_match": {
                    "query": "space nasa rocket",
                    "type": "cross_fields",
                    "fields": [
                        "title",
                        "description",
                        "url"
                    ],
                    "operator": "and"
              }

    }
}

但如果我将它也放入搜索“1960”,因为下面的查询不会返回任何内容

{
        "from": 0,
        "size": 10,
        
        "query": {
          
                
                    "multi_match": {
                        "query": "1960 space nasa rocket",
                        "type": "cross_fields",
                        "fields": [
                            "title",
                            "description",
                            "url"
                        ],
                        "operator": "and"
                  }
    
        }
    }

我发现我的“小写”标记器不会生成数字标记。所以我将我的标记器更改为“标准”并生成 1960 数字标记。

但是查询没有找到任何东西,因为具有链接www.nasa.com 的URL 字段不再生成令牌“www nasa com”,生成的令牌是整个链接www.nasa.com

只有当我输入完整的 URL www.nasa.com 时,查询才有效,如下所示

{
            "from": 0,
            "size": 10,
            
            "query": {
              
                    
                        "multi_match": {
                            "query": "1960 space www.nasa.com rocket",
                            "type": "cross_fields",
                            "fields": [
                                "title",
                                "description",
                                "url"
                            ],
                            "operator": "and"
                      }
        
            }
        }

如果我仅为 URL 字段生成另一个“小写”标记器,则链接 www.nasa.com 会再次生成单独的标记“www nasa com”

但我在下面的查询没有找到任何内容,因为 URL 字段的标记器与其他字段的标题和描述不同。下面的查询仅在我使用 OR 运算符时有效,但我需要 AND 运算符,

{
                "from": 0,
                "size": 10,
                
                "query": {
                  
                        
                            "multi_match": {
                                "query": "1960 space nasa rocket",
                                "type": "cross_fields",
                                "fields": [
                                    "title",
                                    "description",
                                    "url"
                                ],
                                "operator": "and"
                          }
            
                }
            }

我无法在映射中使用 Ngram,因为我使用“短语建议器”,并且当我使用 Ngram 时,生成的建议中包含数百个生成不准确的标记的建议。

有没有人知道我的映射能够在我的“标题和描述”字段中生成数字标记的任何解决方案,但是我的 URL 字段将继续将网站链接分成几个标记“www nasa com”而不是链接是完整的“www .nasa.com”,并且我的查询作为 AND 运算符同时搜索所有字段。

【问题讨论】:

  • 你能添加你的 synonyms.txt 吗?我觉得这就是问题所在。否则一切正常
  • @Gibbs 我的同义词工作正常
  • 无法重现。这是我看到的唯一区别。您是说同义词文件中的内容不会影响此查询。
  • @gibbs 我刚刚测试了从映射中删除同义词,但没有任何改变,同样的问题仍在继续

标签: elasticsearch elasticsearch-5


【解决方案1】:

如果我把它也放在搜索中“1960”,因为下面的查询没有 返回任何东西

在下面的索引映射中,我删除了synonym_filter。删除它并为示例文档编制索引并运行与您在问题中提到的相同的搜索查询后,我能够获得所需的结果

索引映射:

 {
  "settings": {
    "index": {
      "number_of_shards": "5",
      "number_of_replicas": "0",
      "analysis": {
        "filter": {
          "stemmer_plural_portugues": {
            "name": "minimal_portuguese",
            "stopwords": [
              "http",
              "https",
              "ftp",
              "www"
            ],
            "type": "stemmer"
          },
          "shingle_filter": {
            "type": "shingle",
            "min_shingle_size": 2,
            "max_shingle_size": 3
          }
        },
        "analyzer": {
          "analyzer_customizado": {
            "filter": [
              "lowercase",
              "stemmer_plural_portugues",
              "asciifolding",
              "shingle_filter"
            ],
            "tokenizer": "lowercase"
          }
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "id": {
        "type": "long"
      },
      "data": {
        "type": "date"
      },
      "quebrado": {
        "type": "byte"
      },
      "pgrk": {
        "type": "integer"
      },
      "url_length": {
        "type": "integer"
      },
      "title": {
        "analyzer": "analyzer_customizado",
        "type": "text",
        "fields": {
          "keyword": {
            "ignore_above": 256,
            "type": "keyword"
          }
        }
      },
      "description": {
        "analyzer": "analyzer_customizado",
        "type": "text",
        "fields": {
          "keyword": {
            "ignore_above": 256,
            "type": "keyword"
          }
        }
      },
      "url": {
        "analyzer": "analyzer_customizado",
        "type": "text",
        "fields": {
          "keyword": {
            "ignore_above": 256,
            "type": "keyword"
          }
        }
      }
    }
  }
}

搜索查询:

    {
  "from": 0,
  "size": 10,
  "query": {
    "multi_match": {
      "query": "1960 space nasa rocket",
      "type": "cross_fields",
      "fields": [
        "title",
        "description",
        "url"
      ],
      "operator": "and"
    }
  }
}

搜索结果:

"hits": [
        {
            "_index": "my-index",
            "_type": "_doc",
            "_id": "1",
            "_score": 0.9370217,
            "_source": {
                "title": "rocket 1960",
                "description": "space",
                "url": "www.nasa.com"
            }
        }
    ]

正如@Gibbs 所说,我认为synonym_filter 中存在一些问题,所以如果您分享synonym.txt 会更好,否则搜索查询运行良好。

更新 1:(包括 synonym_filter)

如果您想包含同义词标记过滤器,请保持索引映射与您的相同,只需对映射进行一些更改:

 "synonym_filter": {
        "type": "synonym",
        "lenient": true,
        "synonyms_path": "analysis/synonym.txt",
        "updateable" : false  --> set this to false

      },

您将同义词过滤器设置为“可更新”,大概是因为您 想要更改同义词而不必关闭并重新打开索引 而是使用重新加载 API。可更新的同义词限制 它们用于仅在搜索时使用的分析器。

要得到这个的完整解释,可以参考这个ESdiscussion

使用与上述相同的搜索查询(在更改映射后 ),你会得到你想要的结果。

但是如果你还想设置"updateable" : true,那么你可以参考Reload search analyzers API的官方文档

【讨论】:

  • @Jean 如果您将"1960" 放在搜索查询中,那么搜索结果也将完全符合其应有的结果(在删除 synonym_filter 之后)。由于在使用synonym_filter 时问题会出现在您的最后,如果您可以分享synonym.txt,那就太好了
  • 在没有同义词的情况下确实有效。按照我的同义词文件链接:hotbusca.com/synonym.txt
  • @Jean 请仔细阅读我的更新答案,期待您的反馈
  • 是的!有效。非常感谢!你能帮我解决我发给你的链接的另一个问题吗:stackoverflow.com/questions/62616417/…
  • @Jean 很高兴我能在这里提供帮助 :) 如果您能接受并支持我的回答,那就太好了,因为这解决了您的问题 :)
猜你喜欢
  • 2023-03-02
  • 1970-01-01
  • 1970-01-01
  • 2014-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-20
  • 1970-01-01
相关资源
最近更新 更多