Elasticsearch:ES|QL 中的全文搜索 - 8.17

[复制链接]
发表于 2025-12-5 23:57:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
仔细的开辟者假如已经阅读我前两天发布的文章 “Elastic 8.17:Elasticsearch logsdb 索引模式、Elastic Rerank 等”,你就会发现在 8.17 的发布版中,有一个告急的功能发布。那就是 ES|QL 开始支持全文搜索了。在本日的文章中我们来实行一下。
ES|QL 中新的 MATCH 和查询字符串 (QSTR) 函数的技能预览使日志日志搜索更加轻松直观。MATCH 使用 Lucene 匹配查询在 ES|QL 中提供全文搜索功能,而 QTSR 通过启用 Lucene 查询字符串查询来资助更高级地过滤日志日志数据。
ES|QL 的全文搜索使 Discover 中的搜索更加轻松、性能更高,尤其是在处置惩罚多个术语或条件逻辑时。
ES|QL 中的这些新搜索功能提供了显着的性能改进。查询现在可以比等效 RLIKE 查询快 50 倍到 1000 倍,尤其是在较大的数据集上。将此功能添加到 ES|QL 答应你使用 Elastic 的告急上风之一 - 可以大概提前索引全部数据 - 从而一次性完成繁重的工作并在以后实现真正快速的全文搜索。
全部这些都与 Elasticsearch DSL 函数精密团结,以便在搜索中实现更好的功能奇偶校验、直观性和速率。 ES|QL 还提供完备的地理搜索功能,并明显改善按隔断排序的延长。

MATCH function

   告诫:请勿在生产环境中使用。此功能处于技能预览阶段,大概会在将来版本中更改或删除。Elastic 将积极修复任何题目,但技能预览中的功能不受官方 GA 功能的支持 SLA 束缚。
  
语法:

参数:
参数形貌field查询将针对的字段。query你渴望在提供的字段中查找的文本。支持的范例:
fieldqueryresult keyword
  keyword
  boolean
  keyword
  text
  boolean
  text
  keyword
  boolean
  text
  text
  boolean
示例:
我们起首来创建如下的一个 books 索引:
  1. PUT books
  2. {
  3.   "mappings": {
  4.     "properties": {
  5.       "title": {
  6.         "type": "keyword"
  7.       },
  8.       "author": {
  9.         "type": "text"
  10.       },
  11.       "book_no": {
  12.         "type": "long"
  13.       }
  14.     }
  15.   }
  16. }
复制代码
如上所示,我们创建了3个字段,它们分别有差别的属性。我们使用如下的下令来写入文档:
  1. PUT books/_bulk
  2. {"index": {"_id": "1"}}
  3. {"title":"Whispers of Eternity", "book_no": 2378, "author": "[Carol Faulkner, Holly Byers Ochoa, Lucretia Mott]"}
  4. {"index": {"_id": "2"}}
  5. {"title":"The Crimson Horizon", "book_no": 2713, "author": "William Faulkner"}
  6. {"index": {"_id": "3"}}
  7. {"title":"Shadows in Bloom", "book_no": 2847, "author": "Colleen Faulkner"}
  8. {"index": {"_id": "4"}}
  9. {"title":"Echoes of Tomorrow", "book_no": 2883, "author": "William Faulkner"}
  10. {"index": {"_id": "5"}}
  11. {"title":"Beneath the Ashen Sky", "book_no": 2713, "author": "Danny Faulkner"}
复制代码
我们举行如下的搜索:
  1. POST _query?format=txt
  2. {
  3.   "query": """
  4.       FROM books
  5.       | WHERE MATCH(author, "Faulkner")
  6.       | KEEP book_no, author
  7.       | SORT book_no
  8.       | LIMIT 5
  9.    """
  10. }
复制代码
上面的下令得到的结果是:
  1.     book_no    |                      author                     
  2. ---------------+--------------------------------------------------
  3. 2378           |[Carol Faulkner, Holly Byers Ochoa, Lucretia Mott]
  4. 2713           |Danny Faulkner                                    
  5. 2713           |William Faulkner                                 
  6. 2847           |Colleen Faulkner                                 
  7. 2883           |William Faulkner         
复制代码
假如我们去掉谁人 SORT,我们可以看到的排序结果是:
  1. POST _query?format=txt
  2. {
  3.   "query": """
  4.       FROM books
  5.       | WHERE MATCH(author, "Faulkner")
  6.       | KEEP book_no, author
  7.       | LIMIT 5
  8.    """
  9. }
复制代码

我们得到的结果是:
  1.     book_no    |                      author                     
  2. ---------------+--------------------------------------------------
  3. 2378           |[Carol Faulkner, Holly Byers Ochoa, Lucretia Mott]
  4. 2713           |William Faulkner                                 
  5. 2847           |Colleen Faulkner                                 
  6. 2883           |William Faulkner                                 
  7. 2713           |Danny Faulkner                                    
复制代码
我们把搜索词的巨细写改一下成 “faulKner",我们看看能否得到我们想要的结果:
  1. POST _query?format=txt
  2. {
  3.   "query": """
  4.       FROM books
  5.       | WHERE MATCH(author, "faulKner")
  6.       | KEEP book_no, author
  7.       | LIMIT 5
  8.    """
  9. }
复制代码
我们得到的结果是:
  1.     book_no    |                      author                     
  2. ---------------+--------------------------------------------------
  3. 2378           |[Carol Faulkner, Holly Byers Ochoa, Lucretia Mott]
  4. 2713           |William Faulkner                                 
  5. 2847           |Colleen Faulkner                                 
  6. 2883           |William Faulkner                                 
  7. 2713           |Danny Faulkner                                    
复制代码
很显然,我们得到的是同样的结果,只管我们把搜索词的巨细写都改变了。
我们再次做如下的搜索:
  1. POST _query?format=txt
  2. {
  3.   "query": """
  4.       FROM books
  5.       | WHERE MATCH(author, "Danny")
  6.       | KEEP book_no, author
  7.       | LIMIT 5
  8.    """
  9. }
复制代码
我们得到的结果是:
  1.     book_no    |    author     
  2. ---------------+---------------
  3. 2713           |Danny Faulkner
复制代码
很显然这次只有一个结果。但是假如我们如许来举行搜索:
  1. POST _query?format=txt
  2. {
  3.   "query": """
  4.       FROM books
  5.       | WHERE MATCH(author, "Danny Faulkner")
  6.       | KEEP book_no, author
  7.       | LIMIT 5
  8.    """
  9. }
复制代码
我们得到的结果是:
  1.     book_no    |                      author                     
  2. ---------------+--------------------------------------------------
  3. 2378           |[Carol Faulkner, Holly Byers Ochoa, Lucretia Mott]
  4. 2713           |William Faulkner                                 
  5. 2847           |Colleen Faulkner                                 
  6. 2883           |William Faulkner                                 
  7. 2713           |Danny Faulkner        
复制代码
这次得到的结果有点出乎我们的意料。我们更渴望 “Danny Faulkner” 成为排名第一的结果。很显然这个结果并不是我们想要的。
我们接下来针对 keyword 字段来举行测试:
  1. POST _query?format=txt
  2. {
  3.   "query": """
  4.       FROM books
  5.       | WHERE MATCH(title, "The Crimson Horizon")
  6.       | KEEP book_no, title
  7.       | LIMIT 5
  8.    """
  9. }
复制代码
我们得到的结果是:
  1.     book_no    |        title        
  2. ---------------+---------------------
  3. 2713           |The Crimson Horizon  
  4. 2713           |Beneath the Ashen Sky
复制代码
很显然,第二个结果中有一个 the 匹配,以是在召回里含有这个书目。这个还是全文搜索,只管 title 字段是 keyword。
假如我们把 The 改成 the, 我们得到的是一样的结果:
  1. POST _query?format=txt
  2. {
  3.   "query": """
  4.       FROM books
  5.       | WHERE MATCH(title, "the Crimson Horizon")
  6.       | KEEP book_no, title
  7.       | LIMIT 5
  8.    """
  9. }
复制代码
我们可以和从前倒霉用 MATCH function 的查询来举行比力:
  1. POST _query?format=txt
  2. {
  3.   "query": """
  4.       FROM books
  5.       | WHERE author LIKE "William *"
  6.       | KEEP book_no, author
  7.       | LIMIT 5
  8.    """
  9. }
复制代码
上面返回结果:
  1.     book_no    |     author     
  2. ---------------+----------------
  3. 2713           |William Faulkner
  4. 2883           |William Faulkner
复制代码
这是一种 keyword 的搜索 只管 author 字段是 text 字段。假如我们举行如下的搜索:
  1. POST _query?format=txt
  2. {
  3.   "query": """
  4.       FROM books
  5.       | WHERE author LIKE "william *"
  6.       | KEEP book_no, author
  7.       | LIMIT 5
  8.    """
  9. }
复制代码
上面的搜索将没有任何的结果。

QSTR function

   告诫:请勿在生产环境中使用 VALUES。此功能处于技能预览阶段,大概会在将来版本中更改或删除。Elastic 将积极修复任何题目,但技能预览中的功能不受官方 GA 功能的支持 SLA 束缚。
  语法:

参数:
参数形貌queryLucene 查询字符串格式的查询字符串。形貌:
实行查询字符串查询。假如提供的查询字符串与行匹配,则返回 true。
queryresult keyword
  boolean
  text
  boolean
示例:
我们使用如下的示例来举行展示:
  1. POST _query?format=txt
  2. {
  3.   "query": """
  4.       FROM books
  5.       | WHERE QSTR("author: Faulkner")
  6.       | KEEP book_no, author
  7.       | LIMIT 5
  8.    """
  9. }
复制代码
上面下令返回的结果是:
  1.     book_no    |                      author                     
  2. ---------------+--------------------------------------------------
  3. 2378           |[Carol Faulkner, Holly Byers Ochoa, Lucretia Mott]
  4. 2713           |William Faulkner                                 
  5. 2847           |Colleen Faulkner                                 
  6. 2883           |William Faulkner                                 
  7. 2713           |Danny Faulkner           
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表