elasticsearch 基于弹性搜索的双向匹配,elasticsearch,solr,lucene,nosql,elasticsearch,Solr,Lucene,Nosql" /> elasticsearch 基于弹性搜索的双向匹配,elasticsearch,solr,lucene,nosql,elasticsearch,Solr,Lucene,Nosql" />

elasticsearch 基于弹性搜索的双向匹配

elasticsearch 基于弹性搜索的双向匹配,elasticsearch,solr,lucene,nosql,elasticsearch,Solr,Lucene,Nosql,我已经为术语列表编制了索引,现在我想查询其中的一些术语 假设我为“狗粮”、“红狗”、“狗”、“食物”、“猫”编制了索引 如何创建精确的双向匹配查询。ie:我想在搜索“dog”时只搜索术语dog,而不是其他术语(因为它们不匹配) 我想到的一个原始解决方案是用术语的长度(单词)索引术语然后,在搜索长度为X的查询时,将其限制为长度为X的项。但这似乎过于复杂。只需将字段的索引属性设置为未分析,您的查询应使用项过滤器来搜索文本 根据Evaldas的建议,在下面找到一个更完整的解决方案,该解决方案还使用标

我已经为术语列表编制了索引,现在我想查询其中的一些术语

假设我为“狗粮”、“红狗”、“狗”、“食物”、“猫”编制了索引

如何创建精确的双向匹配查询。ie:我想在搜索“dog”时只搜索术语
dog
,而不是其他术语(因为它们不匹配)



我想到的一个原始解决方案是用术语的长度(单词)索引术语然后,在搜索长度为X的查询时,将其限制为长度为X的项。但这似乎过于复杂。

只需将字段的
索引属性设置为
未分析
,您的查询应使用
过滤器来搜索文本

根据Evaldas的建议,在下面找到一个更完整的解决方案,该解决方案还使用
标准
analyzer对原始值进行索引,但使用带有小写版本的术语的子字段:

PUT /test
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_keyword_lowercase_analyzer": {
          "type": "custom",
          "filter": [
            "lowercase"
          ],
          "tokenizer": "keyword"
        }
      }
    }
  },
  "mappings": {
    "asset": {
      "properties": {
        "name": {
          "type": "string",
          "fields": {
            "case_ignore": {
              "type": "string",
              "analyzer": "my_keyword_lowercase_analyzer"
            }
          }
        }
      }
    }
  }
}

POST /test/asset/1
{
  "name":"dog"
}
POST /test/asset/2
{
  "name":"dog food"
}
POST /test/asset/3
{
  "name":"red dog"
}

GET /test/asset/_search
{
  "query": {
    "match": {
      "name.case_ignore": "Dog"
    }
  }
}

创建一个自定义分析器,使搜索词小写并规范化。这就是你的索引:

{
  "settings" : {
    "analysis" : {
      "analyzer" : {
        "my_analyzer_keyword" : {
          "type" : "custom",
          "tokenizer" : "keyword",
          "filter" : [
            "asciifolding",
            "lowercase"
          ]
        }
      }
    }
  },
  "mappings" : {
    "your_type" : {
      "properties" : {
        "name" : {
          "type" : "string",
          "analyzer" : "my_analyzer_keyword"
        }
      }
    }
  }
}

因此,如果您索引了
“dog”
,并且用户在
dog
dog
dog
中键入了内容,则它将只匹配
dog
不会带回“狗粮”

不会这样做。以大写字母为例。@EvaldasBuinauskas我在OP中没有看到任何大写字母;-)。商店方面是的。但用户可以键入任何内容!:)