我应该在模糊查询字段中包含空格吗?

洛伦

我有此数据:

name:
  first: 'John'
  last: 'Smith'

当我将其存储在ES中时,最好将AFAICT设置为一个字段。但是,此字段应为:

name: 'John Smith'

或者

name: 'JohnSmith'

我认为查询应该是:

query: 
  match: 
    name: 
      query: searchTerm
      fuzziness: 'AUTO'
      operator: 'and'

人们可能会在搜索框中输入搜索字词示例,例如

John
Jhon Smi
J Smith
Smith

等等。

斯隆·阿伦斯(Sloan Ahrens)

您可能需要结合使用ngram和模糊匹配查询。如果需要入门,我写了一篇有关Qbox的ngram的博客文章:https ://qbox.io/blog/an-introduction-to-ngrams-in-elasticsearch 我将在文章结尾处滑动入门代码,以说明我的意思。

另外,无论您使用两个字段name还是仅使用一个字段,我都认为没有太大关系如果由于其他原因需要两个字段,则可能要在查询中使用该_all字段为简单起见,我在这里只使用一个字段。

这是一个映射,可以让您获得想要的部分单词匹配,假设您只在乎单词开头的标记(否则使用ngrams而不是edge ngrams)。使用ngram有很多细微差别,因此如果您需要更多信息,我将参考您的文档和入门。

PUT /test_index
{
   "settings": {
      "number_of_shards": 1,
      "analysis": {
         "filter": {
            "edge_ngram_filter": {
               "type": "edge_ngram",
               "min_gram": 1,
               "max_gram": 10
            }
         },
         "analyzer": {
            "edge_ngram_analyzer": {
               "type": "custom",
               "tokenizer": "standard",
               "filter": [
                  "lowercase",
                  "edge_ngram_filter"
               ]
            }
         }
      }
   },
   "mappings": {
      "doc": {
         "properties": {
            "name": {
               "type": "string",
               "index_analyzer": "edge_ngram_analyzer",
               "search_analyzer": "standard"
            }
         }
      }
   }
}

这里要特别注意的一件事:"min_gram": 1这意味着将从索引值生成单字符令牌。当您查询时,这将产生一个相当宽的网络(例如,许多单词以“ j”开头),因此您可能会得到一些意外的结果,尤其是在与模糊性结合时。但这是使您的“ J Smith”查询正常运行所必需的。因此,需要权衡取舍。

为了说明,我索引了四个文档:

PUT /test_index/doc/_bulk
{"index":{"_id":1}}
{"name":"John Hancock"}
{"index":{"_id":2}}
{"name":"John Smith"}
{"index":{"_id":3}}
{"name":"Bob Smith"}
{"index":{"_id":4}}
{"name":"Bob Jones"}

您的查询通常有效,但有几点警告。

POST /test_index/_search
{
    "query": {
        "match": {
           "name": {
               "query": "John",
               "fuzziness": "AUTO",
               "operator": "and"
           }
        }
    }
}

由于ngrams加上模糊性,此查询返回三个文档:

{
   "took": 3,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "failed": 0
   },
   "hits": {
      "total": 3,
      "max_score": 0.90169895,
      "hits": [
         {
            "_index": "test_index",
            "_type": "doc",
            "_id": "1",
            "_score": 0.90169895,
            "_source": {
               "name": "John Hancock"
            }
         },
         {
            "_index": "test_index",
            "_type": "doc",
            "_id": "2",
            "_score": 0.90169895,
            "_source": {
               "name": "John Smith"
            }
         },
         {
            "_index": "test_index",
            "_type": "doc",
            "_id": "4",
            "_score": 0.6235822,
            "_source": {
               "name": "Bob Jones"
            }
         }
      ]
   }
}

那可能不是您想要的。另外,"AUTO"不适用于“ Jhon Smi”查询,因为“ Jhon”与“ John”的编辑距离为2,而“ AUTO”对3-5个字符的字符串使用的编辑距离为1(请参阅文档有关更多信息)。因此,我必须改用以下查询:

POST /test_index/_search
{
    "query": {
        "match": {
           "name": {
               "query": "Jhon Smi",
               "fuzziness": 2,
               "operator": "and"
           }
        }
    }
}
...
{
   "took": 17,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "failed": 0
   },
   "hits": {
      "total": 1,
      "max_score": 1.4219328,
      "hits": [
         {
            "_index": "test_index",
            "_type": "doc",
            "_id": "2",
            "_score": 1.4219328,
            "_source": {
               "name": "John Smith"
            }
         }
      ]
   }
}

其他查询按预期方式工作。因此,该解决方案并不完美,但是它将使您接近。

这是我使用的所有代码:

http://sense.qbox.io/gist/ba5a6741090fd40c1bb20f5d36f3513b4b55ac77

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我应该在交易中包含SELECT吗?

来自分类Dev

我应该在备份中包含/ dev吗?

来自分类Dev

我应该在“然后”之前放置空格吗?

来自分类Dev

我应该在模板类头文件中包含所需的所有内容吗?

来自分类Dev

我应该在模板类头文件中包含所需的所有内容吗?

来自分类Dev

我应该在静态字段中缓存比较器吗?

来自分类Dev

我应该在android类中为计算字段定义属性或函数吗?

来自分类Dev

我应该在HABTM表中包括其他字段吗?

来自分类Dev

我应该在“ package.json”的“ dependencies”字段中复制“ peerDependencies”吗?

来自分类Dev

我应该在C#中通过属性设置器分配类字段吗?

来自分类Dev

我应该在静态字段中缓存比较器吗?

来自分类Dev

我应该在android类中为计算字段定义属性或函数吗?

来自分类Dev

我应该在DocumentDb中取消规范化或运行多个查询吗?

来自分类Dev

我是否应该在PHP中包含HTML

来自分类Dev

我应该在主文件中包含已经包含在.h文件中的标头吗?

来自分类Dev

我应该在模型中抛出HttpStatus异常吗?

来自分类Dev

我应该在表示层中抛出异常吗?

来自分类Dev

我应该在onDestroyView中删除OnClickListener吗?

来自分类Dev

我应该在virtualenv中安装python 3吗?

来自分类Dev

我应该在C ++的类中存储引用吗?

来自分类Dev

我应该在Rust中返回等待吗?

来自分类Dev

我应该在C ++中删除静态对象吗

来自分类Dev

我应该在virtualenv中安装python 3吗?

来自分类Dev

我应该在系统中杀死僵尸进程吗?

来自分类Dev

我应该在onDestroyView中删除OnClickListener吗?

来自分类Dev

我应该在Java中嵌套这些类吗?

来自分类Dev

我应该在Angular 2的angular-cli或index.html中包含css和js吗?

来自分类Dev

为了性能,我们应该在 ES6 类的原型中包含方法吗?

来自分类Dev

我应该在schema.xml中保留预定义的字段吗?是Solr吗?

Related 相关文章

  1. 1

    我应该在交易中包含SELECT吗?

  2. 2

    我应该在备份中包含/ dev吗?

  3. 3

    我应该在“然后”之前放置空格吗?

  4. 4

    我应该在模板类头文件中包含所需的所有内容吗?

  5. 5

    我应该在模板类头文件中包含所需的所有内容吗?

  6. 6

    我应该在静态字段中缓存比较器吗?

  7. 7

    我应该在android类中为计算字段定义属性或函数吗?

  8. 8

    我应该在HABTM表中包括其他字段吗?

  9. 9

    我应该在“ package.json”的“ dependencies”字段中复制“ peerDependencies”吗?

  10. 10

    我应该在C#中通过属性设置器分配类字段吗?

  11. 11

    我应该在静态字段中缓存比较器吗?

  12. 12

    我应该在android类中为计算字段定义属性或函数吗?

  13. 13

    我应该在DocumentDb中取消规范化或运行多个查询吗?

  14. 14

    我是否应该在PHP中包含HTML

  15. 15

    我应该在主文件中包含已经包含在.h文件中的标头吗?

  16. 16

    我应该在模型中抛出HttpStatus异常吗?

  17. 17

    我应该在表示层中抛出异常吗?

  18. 18

    我应该在onDestroyView中删除OnClickListener吗?

  19. 19

    我应该在virtualenv中安装python 3吗?

  20. 20

    我应该在C ++的类中存储引用吗?

  21. 21

    我应该在Rust中返回等待吗?

  22. 22

    我应该在C ++中删除静态对象吗

  23. 23

    我应该在virtualenv中安装python 3吗?

  24. 24

    我应该在系统中杀死僵尸进程吗?

  25. 25

    我应该在onDestroyView中删除OnClickListener吗?

  26. 26

    我应该在Java中嵌套这些类吗?

  27. 27

    我应该在Angular 2的angular-cli或index.html中包含css和js吗?

  28. 28

    为了性能,我们应该在 ES6 类的原型中包含方法吗?

  29. 29

    我应该在schema.xml中保留预定义的字段吗?是Solr吗?

热门标签

归档