【问题标题】:Starts with and full text search on same field in one query using RavenDB使用 RavenDB 在一个查询中对同一字段进行全文搜索
【发布时间】:2014-12-10 23:37:08
【问题描述】:

我有一个对象,其中一个字符串字段存储在 RavenDB 中。例如:

public class SomeObject
{
    public string SomeText = "hello world";
}

我希望能够在同一查询中检查以下两项:

  1. 检查整个字符串是否以某个值开头。在这种情况下:
    • “地狱”将匹配
    • “hello”会匹配
    • “hello w”将匹配
    • “world”将匹配
    • “world hello”将匹配
  2. 检查字符串是否包含某些术语。假设它们是空格分隔的,在这种情况下:
    • “地狱”将匹配
    • “hello”会匹配
    • “hello w”将匹配
    • “世界”将匹配
    • “world hello”将匹配

设置索引(我假设?)以便能够在同一个查询中执行此操作的好方法是什么?

编辑:澄清我希望能够在同一个查询中检查这两件事。

【问题讨论】:

    标签: c# ravendb


    【解决方案1】:

    看看here。我想您可以结合使用 Where(n => n.StartsWith(...))Search(...) 查询。

    【讨论】:

    • 我试图从概念上理解这一点,如果我错了,请告诉我。如果我按照链接创建索引documentStore.DatabaseCommands.PutIndex("SomeObjectsBySomeText", new IndexDefinition { Map = "from someObject in docs.SomeObjects select new { someObject.SomeText }", Indexes = { { "SomeText", FieldIndexing.Analyzed } } });,它将使用 StandardAnalyzer(术语“hello”和“world”)而不是 LowerCaseKeywordAnalyzer(术语“hello world”)。如果我然后打电话给Where(o => o.SomeText.StartsWith("wor")),它会匹配还是不匹配?为什么?
    【解决方案2】:

    我最终将两个字段添加到索引中,均基于 SomeText

    一个使用StandardAnalyzer进行分析,另一个使用LowerCaseKeywordAnalyzer进行分析。

    这让我可以使用LowerCaseKeywordAnalyzer 索引的字段开始搜索。如果 any 项以任何开头而不是 整个字符串 开头,则使用由 StandardAnalyzer 索引的字段会产生命中。

    可以使用StandardAnalyzer 索引的字段并行搜索术语。

    我不知道这是否是最好的解决方案,但它解决了我的问题。

    【讨论】:

    • 你能贴出你如何开始工作的代码吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    • 2017-07-12
    • 2018-09-22
    • 2017-08-25
    • 2023-03-08
    • 2011-07-08
    相关资源
    最近更新 更多