【问题标题】:In ES how to write mappings so that to use wildcard query for both lowercase as well as uppercase?在 ES 中如何编写映射以便对小写和大写都使用通配符查询?
【发布时间】:2015-11-18 05:18:28
【问题描述】:

大家好,我在 ES 中面临两个问题

  1. 我在 ES 中有一个“城市”“纽约”,现在我想编写一个术语过滤器,这样如果给定的字符串与“纽约”完全匹配,那么只有它返回,但发生的情况是当我的过滤器匹配“新" 或 "York" 两者都返回 "New York" 但它没有返回任何 "New York" 我的映射在下面给出请告诉我应该在映射中使用哪个分析器或标记器

这里是设置和映射:

"settings": {
        "index": {
          "analysis": {
            "analyzer": {
              "synonym": {
                "tokenizer": "whitespace",
                "filter": ["synonym"]
              }
            },
            "filter": {
              "synonym": {
                "type": "synonym",
                "synonyms_path": "synonyms.txt"
              }
            }
          }
        }
      },
      mappings : {
        "restaurant" : {
          properties:{
            address         : {
                properties:{
                    city         : {"type" : "string", "analyzer": "synonym"},
                }
            }
          }
        }
  1. 第二个问题是,当我尝试对小写示例“new*”使用通配符查询时,ES 没有返回任何内容,但是当我尝试搜索大写示例“New*”时,它现在返回“New York”现在我在第二种情况下,我想编写我的城市映射,这样当我为两个 ES 搜索小写或大写时,我会返回相同的东西,我已经看到忽略大小写,并且我在同义词中将其设置为 false,但我仍然无法搜索小写和大写。

         "synonym": {
                "type": "synonym",
                "synonyms_path": "synonyms.txt",
                "ignore_case": true   // See here 
              }
    

【问题讨论】:

  • 你的同义词文件怎么样?是像ny, nyc , new york city => new york 还是ny, nyc ,new york city, new york 因为你指定同义词的方式会产生影响
  • 同义词文件中没有纽约
  • @amanverma 提供与New York 搜索相关的synonyms.txt 文件的内容。
  • no synonyms file 与 ne york 无关 我有不同的地方,我会告诉你它包含什么 mumbai、bombay calcutta、kolkata puducherry、pondicherry Bangalore、Bengaluru

标签: elasticsearch filter


【解决方案1】:

我认为您没有提供足够的详细信息,但希望我的尝试会引起您的疑问,我将发布我认为应该向前迈出的一步:

映射

PUT test
{
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "synonym": {
            "tokenizer": "whitespace",
            "filter": [
              "synonym"
            ]
          },
          "keyword_lowercase": {
            "type": "custom",
            "tokenizer": "keyword",
            "filter": [
              "lowercase"
            ]
          }
        },
        "filter": {
          "synonym": {
            "type": "synonym",
            "synonyms_path": "synonyms.txt",
            "ignore_case": true
          }
        }
      }
    }
  },
  "mappings": {
    "restaurant": {
      "properties": {
        "address": {
          "properties": {
            "city": {
              "type": "string",
              "analyzer": "synonym",
              "fields": {
                "raw": {
                  "type": "string",
                  "index": "not_analyzed"
                },
                "raw_ignore_case": {
                  "type": "string",
                  "analyzer": "keyword_lowercase"
                }
              }
            }
          }
        }
      }
    }
  }
}

测试数据:

POST /test/restaurant/1
{
  "address": {"city":"New York"}
}
POST /test/restaurant/2
{
  "address": {"city":"new york"}
}

查询第一个问题

GET /test/restaurant/_search
{
  "query": {
    "filtered": {
      "filter": {
        "term": {
          "address.city.raw": "New York"
        }
      }
    }
  }
}

查询第二个问题

GET /test/restaurant/_search
{
  "query": {
    "query_string": {
      "query": "address.city.raw_ignore_case:new*"
    }
  }
}

【讨论】:

  • 如果我向纽约查询第二个问题的解决方案会是什么结果?它会返回纽约吗??
  • 如果我想过滤“纽约”但也想在那里使用同义词文件,你也没有根据你的解决方案得到它,我怎么能使用我的意思是因为你已经将 .raw 设置为 not_analyzed所以它不会在同义词文件中查找术语过滤器??
  • 对于第二个问题,是的。对于同义词,它取决于你想用它做什么。你想匹配什么?给出输入和期望输出的例子。
  • 假设我想应用过滤字符串为 nyc 的术语过滤器,但我在我的 synonyms.txt 中将 nyc 作为纽约,所以这个过滤器将返回纽约,但根据你的解决方案它不会得到它??
  • 当您使用term 过滤器时,您在过滤器中使用的文本将不会被分析。所以无论你放在那里(小写,大写)它都会完全匹配。这意味着您的索引需要有可用的数据来匹配它(所有同义词的小写和大写)。我建议寻找其他东西而不是 term OR 小写进入您的 term 过滤器的所有内容,以便您知道要在索引中匹配小写字母。
猜你喜欢
  • 1970-01-01
  • 2020-03-14
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
  • 2011-01-30
  • 2010-11-05
  • 2016-03-07
  • 2020-01-15
相关资源
最近更新 更多