gpt4 book ai didi

lucene - Sitecore Search Predicate Builder 多关键字搜索与 boosting 无法按预期工作

转载 作者:行者123 更新时间:2023-12-04 12:18:20 25 4
gpt4 key购买 nike

我有包含以下字段的 sitecore 页面/lucene 文档:

  • 标题
  • 文件名
  • 内容
  • 文件内容

  • 我正在为这些创建搜索并具有以下要求:
  • 应首先返回在标题字段中包含整个短语的命中。
  • 应该第二次返回在文件名字段中包含整个短语的命中。
  • 内容中包含整个短语的点击应返回第三个
  • 在文件内容中包含整个短语的命中应该返回第四个
  • 标题字段中包含所有关键字(以任何顺序)的命中应返回第五个
  • 在文件名字段中包含所有关键字(以任何顺序)的命中应返回第六个
  • 内容中包含所有关键字(以任何顺序)的点击应返回第七位。
  • 包含文件内容中所有关键字(以任何顺序)的命中应返回第八位。

  • 这是我所拥有的:

        public static Expression<Func<T, bool>> GetSearchTermPredicate<T>(string searchTerm) 
    where T : ISearchableItem
    {
    var actualPhrasePredicate = PredicateBuilder.True<T>()
    .Or(r => r.Title.Contains(searchTerm).Boost(2f))
    .Or(r => r.FileName.Contains(searchTerm).Boost(1.5f))
    .Or(r => r.Content.Contains(searchTerm))
    .Or(r => r.DocumentContents.Contains(searchTerm));

    var individualWordsPredicate = PredicateBuilder.False<T>();

    foreach (var term in searchTerm.Split(' '))
    {
    individualWordsPredicate
    = individualWordsPredicate.And(r =>
    r.Title.Contains(term).Boost(2f)
    || r.FileName.Contains(term).Boost(1.5f)
    || r.Content.Contains(term)
    || r.DocumentContents.Contains(term));
    }

    return PredicateBuilder.Or(actualPhrasePredicate.Boost(2f),
    individualWordsPredicate);
    }

    实际的短语部分似乎运行良好。标题中包含完整短语的命中将首先返回。但是,如果我从短语中间删除一个单词,则不会返回任何结果。

    即我有一个标题为“英格兰足球队很可怕”的页面,但是当我搜索“足球队很可怕”时,它没有找到该页面。

    注意:页面可以附加文档,所以我也想提升文件名,但不像页面标题那么高。

    最佳答案

    我设法让它与以下一起工作:

        public static Expression<Func<T, bool>> GetSearchTermPredicate<T>(string searchTerm) 
    where T : ISearchableItem
    {
    var actualPhraseInTitlePredicate = PredicateBuilder.True<T>()
    .And(r => r.Title.Contains(searchTerm));

    var actualPhraseInFileNamePredicate = PredicateBuilder.True<T>()
    .And(r => r.FileName.Contains(searchTerm));

    var actualPhraseInContentPredicate = PredicateBuilder.True<T>()
    .And(r => r.Content.Contains(searchTerm));

    var actualPhraseInDocumentPredicate = PredicateBuilder.True<T>()
    .And(r => r.DocumentContents.Contains(searchTerm));

    var terms = searchTerm.Split(' ');

    var titleContainsAllTermsPredicate = PredicateBuilder.True<T>();

    foreach (var term in terms)
    titleContainsAllTermsPredicate
    = titleContainsAllTermsPredicate.And(r => r.Title.Contains(term).Boost(2f));

    var fileNameAllTermsContains = PredicateBuilder.True<T>();

    foreach (var term in terms)
    fileNameAllTermsContains
    = fileNameAllTermsContains.And(r => r.FileName.Contains(term));

    var contentContainsAllTermsPredicate = PredicateBuilder.True<T>();

    foreach (var term in terms)
    contentContainsAllTermsPredicate
    = contentContainsAllTermsPredicate.And(r => r.Content.Contains(term));

    var documentContainsAllTermsPredicate = PredicateBuilder.True<T>();

    foreach (var term in terms)
    documentContainsAllTermsPredicate
    = documentContainsAllTermsPredicate.And(r => r.DocumentContents.Contains(term));


    var predicate = actualPhraseInTitlePredicate.Boost(3f)
    .Or(actualPhraseInFileNamePredicate.Boost(2.5f))
    .Or(actualPhraseInContentPredicate.Boost(2f))
    .Or(actualPhraseInDocumentPredicate.Boost(1.5f))
    .Or(titleContainsAllTermsPredicate.Boost(1.2f))
    .Or(fileNameAllTermsContains.Boost(1.2f))
    .Or(contentContainsAllTermsPredicate)
    .Or(documentContainsAllTermsPredicate);

    return predicate;
    }

    这显然是更多的代码,但我认为分离谓词对于提升有效工作更有意义。

    之前代码的主要问题有两个:
  • PredicateBuilder.Or(actualPhrasePredicate.Boost(2f), individualWordsPredicate)似乎不包括谓词是 Or'd。当做 .ToString()在结果连接谓词上,表达式不包含 individualWordsPredicate 的任何内容。
  • 修复后它仍然不起作用,这是因为我使用的是PredicateBuilder.False<T>()individualWordsPredicate .查看表达式时,它基本上是在生成 (False AND Field.Contains(keyword))这当然永远不会评估为真。使用 .True<T>()修复了这个。
  • 关于lucene - Sitecore Search Predicate Builder 多关键字搜索与 boosting 无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38261886/

    25 4 0