דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
pcinfogmachP

pcinfogmach

@pcinfogmach
אודות
פוסטים
804
נושאים
200
שיתופים
0
קבוצות
0
עוקבים
3
עוקב אחרי
1

פוסטים

פוסטים אחרונים הגבוה ביותר שנוי במחלוקת

  • איך לייצר TextBlock עם טקסט מעוצב ב-wpf שיכול לקבל binding
    pcinfogmachP pcinfogmach

    דרך xaml מאוד קל לעצב טקסט ב- textblock ב-wpf
    כמתואר כאן בטוב טעם

    אבל איך עושים binding עבור זה?
    ראיתי הרבה כתבות בנושא וכל אחד מציע את הזווית שלו הנה הניסיון שלי (הוא מוגבל כרגע לbold ן-italics אבל אפשר להרחיב את הרעיון, אשמח לקבל משוב:

    <Window x:Class="HighlightSample.HighlighterTest"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:HighlightSample"
            mc:Ignorable="d"
            Title="HighlighterTest" 
            Height="250" Width="250">
        <Window.DataContext>
            <local:HighlighterTextViewModel x:Name="vm"/>
        </Window.DataContext>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <Button x:Name="PopulateButton" Command="{Binding PopulateResultsCommand}"
                    Content="Populate" Margin="5"/>
            <ListBox ItemsSource="{Binding SearchResults}" Grid.Row="1">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <local:HighlighterTextBlock
                                HighlightedText="{Binding SearchResult}" 
                                TextWrapping="Wrap"/>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </Grid>
    </Window>
    
    
    using System;
    using System.Text.RegularExpressions;
    using System.Windows.Controls;
    using System.Windows;
    using System.Windows.Documents;
    using System.Collections.ObjectModel;
    using System.Windows.Input;
    using System.ComponentModel;
    using System.Runtime.CompilerServices;
    using PdfiumViewer.Demo.Annotations;
    
    namespace HighlightSample
    {
    
    
        internal class HighlighterTextViewModel : ViewModelBase
        {
            private ObservableCollection<TextModel> _searchResults = new ObservableCollection<TextModel> { };
    
            public ICommand PopulateResultsCommand { get => new RelayCommand(PopulateResults); }
            public void PopulateResults()
            {
                for (int i = 0; i < 100000; i++)
                {
                    SearchResults.Add(new TextModel());
                }
            }
    
            public ObservableCollection<TextModel> SearchResults
            {
                get { return _searchResults; }
                set
                {
                    if (_searchResults != value)
                    {
                        _searchResults = value;
                        OnPropertyChanged(nameof(SearchResults));
                    }
                }
            }
    
    
        }
    
        internal class TextModel : ViewModelBase
        {
            private string _searchResult = "This is a <b>bold</b> and <i>italic</i> example.";
    
            public string SearchResult
            {
                get { return _searchResult; }
                set
                {
                    if (_searchResult != value)
                    {
                        _searchResult = value;
                        OnPropertyChanged(nameof(SearchResult));
                    }
                }
            }
        }
    
        public class HighlighterTextBlock : TextBlock
        {
            public static readonly DependencyProperty HighlightedTextProperty =
                DependencyProperty.Register("HighlightedText", typeof(string), typeof(HighlighterTextBlock), new PropertyMetadata(string.Empty, OnHighlightedTextChanged));
    
            public string HighlightedText
            {
                get { return (string)GetValue(HighlightedTextProperty); }
                set { SetValue(HighlightedTextProperty, value); }
            }
    
            private static void OnHighlightedTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
            {
                var control = d as HighlighterTextBlock;
                control?.UpdateText();
            }
    
            private void UpdateText()
            {
                Inlines.Clear();
                if (string.IsNullOrEmpty(HighlightedText))
                {
                    return;
                }
    
                string pattern = @"(<b>(.*?)</b>)|(<i>(.*?)</i>)"; // Example pattern for bold and italic tags
    
                int lastPos = 0;
                var matches = Regex.Matches(HighlightedText, pattern);
    
                foreach (Match match in matches)
                {
                    // Add text before the match
                    if (match.Index > lastPos)
                    {
                        Inlines.Add(new Run(HighlightedText.Substring(lastPos, match.Index - lastPos)));
                    }
    
                    // Add highlighted or formatted text
                    if (match.Groups[1].Success) // Bold tag
                    {
                        Inlines.Add(new Bold(new Run(match.Groups[2].Value)));
                    }
                    else if (match.Groups[3].Success) // Italic tag
                    {
                        Inlines.Add(new Italic(new Run(match.Groups[4].Value)));
                    }
    
                    lastPos = match.Index + match.Length;
                }
    
                // Add remaining text after the last match
                if (lastPos < HighlightedText.Length)
                {
                    Inlines.Add(new Run(HighlightedText.Substring(lastPos)));
                }
            }
        }
    
        public abstract class ICommandBase : ICommand
        {
            public event EventHandler CanExecuteChanged;
    
            public virtual bool CanExecute(object parameter)
            {
                return true;
            }
    
            public abstract void Execute(object parameter);
    
            protected void OnCanExecuteChanged()
            {
                CanExecuteChanged?.Invoke(this, new EventArgs());
            }
        }
    
        public class RelayCommand : ICommandBase
        {
            private Action commandTask;
    
            public RelayCommand(Action action)
            {
                commandTask = action;
            }
            public override void Execute(object parameter)
            {
                commandTask();
            }
        }
    
        public abstract class ViewModelBase : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
    
            [NotifyPropertyChangedInvocator]
            protected virtual void OnPropertyChanged([CallerMemberName] string PropertyName = null) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(PropertyName));
    
            [NotifyPropertyChangedInvocator]
            protected virtual bool Set<T>(ref T field, T value, [CallerMemberName] string PropertyName = null)
            {
                if (Equals(field, value)) return false;
                field = value;
                OnPropertyChanged(PropertyName);
                return true;
            }
        }
    }
    
    תכנות

  • למה האפריקאים שחורים
    pcinfogmachP pcinfogmach

    צורת הוולד הן בגוף והן במידותיו משתנה לפי הסביבה שבה ההורים חיים ולפי איפה שהראש שלהם נמצא. כמבואר לגבי הסיפור של מנשה מלך ישראל ובעוד מקומות.

    עוד יש לעיין בדברי הגמ' תלמוד בבלי מסכת ברכות דף לא עמוד ב
    אם היתה יולדת בצער יולדת בריוח, נקבות - יולדת זכרים, שחורים - יולדת לבנים,
    הרי משמע מזה שהיו שחורים ולבנים בעם ישראל מימי קדם.
    כמו"כ ידועם דברי רבותינו שלבן הארמי אחיה של רבקה היה "שחור" דהיינו שאפילו השם שלו "לבן" היה שקר.

    סליחה על הבורות אבל רציתי לשאול האם נישואי תערובת של שחורים ולבנים מניבים אי פעם ילד לבן? אני לא מדבר על קרם אני מדבר על לבן...

    גומלין - כללי

  • wpf איך לשנות את הצבע של פקד כאשר העכבר מעליו שלא יהיה כחול
    pcinfogmachP pcinfogmach

    @dovid
    בעצם אני צריך לפרק כל פריט ולעצב את הדבר מדוייק שאני רוצה שיתשנה הרקע שלו על ידי ריחוף העכבר?
    מתסכל....
    תודה בכל אופן

    תכנות

  • wpf איך לשנות את הצבע של פקד כאשר העכבר מעליו שלא יהיה כחול
    pcinfogmachP pcinfogmach

    @dovid
    אני מעוניין לעשות זאת בכמה פקדים או יותר נכון בכל הפקדים אבל מה שדחוף לי זה הרשימה דלהלן:
    togglebutton
    button
    listview
    listbox
    treeview

    תכנות

  • wpf איך לשנות את הצבע של פקד כאשר העכבר מעליו שלא יהיה כחול
    pcinfogmachP pcinfogmach

    מישהו יודע איך לשנות את הצבע של פקד wpf כאשר העכבר מעליו שלא יהיה כחול אלא צבע אחר?

    נסיתי את זה

        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="LightGray"/>
    

    וגם את זה

    <ToggleButton.Style>
        <Style TargetType="ToggleButton">
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="BorderThickness" Value="0"/>
            <Style.Triggers>
                <Trigger Property="IsChecked" Value="True">
                    <Setter Property="Background" Value="LightGray"/>
                </Trigger>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Background" Value="LightGray"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </ToggleButton.Style>
    
    תכנות

  • הצגת מסמכי pdf ב-.net - כל המידע שאספתי בנושא
    pcinfogmachP pcinfogmach

    למי שעדיין מעוניין בנושא מצאתי את זה:
    https://github.com/majkimester/PdfiumViewer.WPF

    תכנות

  • ספרייה להמרת קבצי ורד ל- C# pdf
    pcinfogmachP pcinfogmach

    @חגי
    הממ.. מחיקה של תוכן תיקייה זו עזר נראה אם זה צץ שוב

    תכנות

  • ספרייה להמרת קבצי ורד ל- C# pdf
    pcinfogmachP pcinfogmach

    @חגי כתב בספרייה להמרת קבצי ורד ל- C# pdf:

    ExportAsFixedFormat

    עובד מצויין!
    דא עקא ששכעת גיליתי שאם וורד כבר פתוח אז כאשר קוראים לו מתוך תוכנה חיצונית הוא גורם לשגיאה דלהלן
    1082b09b-12dc-495e-928a-77c9266dd656-image.png

    וזה לא עוזר לשנות את הגדרות הבטיחות של וורד

    תכנות

  • ספרייה להמרת קבצי ורד ל- C# pdf
    pcinfogmachP pcinfogmach

    @חגי
    תודה
    מה זה ExportAsFixedFormat ?

    תכנות

  • ספרייה להמרת קבצי ורד ל- C# pdf
    pcinfogmachP pcinfogmach

    מישהו מכיר ספרייה חיניית להמרת קבצי ורד ל-pdf? (ללא צורך בהתקנת וורד במחשב)...
    ב- C#
    תודה מראש

    תכנות

  • בעיה | אדובי רידר גרסה בעברית - שפת התפריטים רק באנגלית
    pcinfogmachP pcinfogmach

    @חייםיודלביץ
    אתה יכול להתשמש עם pdfxchange זוהי תוכנה משולבת של קריאה ועריכת pdf עובדת ממש נפלא
    החלק של העריכה בתשלום וא מתשמשים בו אז הוא מוסיף סימנים למסמך שקשה להסיר אבל אתה יכול פשוט לככוץ את סרגל הכלים ויהיה לך קורא pdf נפלא עם ביצועים מדהימים
    וזה תומך גם בעברית מלאה

    תוכנה

  • C# ב-multiplatform?
    pcinfogmachP pcinfogmach

    אשמח לעזרתכם בשאלה בנושא פיתוח מרובה פלטפורמות בשפת C#.

    נתקלתי במספר מסגרות עבודה (Frameworks) התומכות בפיתוח מרובה פלטפורמות ב-C#. עם זאת, אני תוהה כיצד נושא הקריאה והכתיבה של קבצים מטופל בספריות השונות. האם גם ספריות אלו תומכות בפיתוח מרובה פלטפורמות?

    הספריות שמעניינות אותי במיוחד הן:

    Lucene.NET
    TikaOnDotNet
    Docnet
    

    לטענת ChatGPT, התשובה חיובית, אך אני מעוניין לדעת כיצד אוכל לוודא זאת לפני שאני מתחיל ללמוד ולהשקיע בפריימוורק מסוים.

    בנוסף, אשמח לשמוע על המלצות לפריימוורק שכדאי לי לשקול.

    תכנות

  • מחשב מומלץ לרכישה...
    pcinfogmachP pcinfogmach

    @קינג-קומפיוטר
    @ek0583232948

    אבא שלי קנה כזה מחשב והיה נצרך לתיקון די מהר הבעיה לא הייתה בפלסטיקה אלא במטען שנהרסו לו הפינים. מה הקטע שלהם לעשות כזה דבר חלש בדור שלנו אין לי מושג.

    בכל אופן יש מעלה לdell מצד האחריות הם באמת עומדים בדיבור שלהם. ומכיון שמדובר במחשב פשוט לשימוש יום יומי שהם לא שורדים הרבה אז באמת האחריות משדרג את כל העסק.
    רק לוודא שבאמת העיסקה כוללת את האחריות הזו של שלוש שנים כי לפעמים הם מוכרים עם אחריות של שנה.

    מצד הביצעים לא יהיה לך בעיות עם הדל יש לו ביצועים יפים למה שאתה צריך.

    בהצלחה

    עריכה:
    שאלתי את באב שלי שוב אם הוא מרוצה מהמחשב הזה הוא אמר לי שהוא ממש לא מרוצה המחשב לא זורם לו....
    הפליסטיקה העיצוב הכל לא נעשה טוב....

    חומרה

  • רג'קס להסרת גרשיים מטקסט מלבד ר"ת
    pcinfogmachP pcinfogmach

    אינני בקי ברגקס של JS
    אבל ב-C# הייתי עושה כך:

    ^"|"$|" | "
    

    ההחלפה קצת יותר מורכבת כי אתה צריך להיזהר לא להחליף את הרווח. ולכן ייתכן שה-lookahead וה-lookbehind עדיף במקרה הזה כמו שצדיק תמים כתב
    https://regex101.com/r/CajTc0/1

    תכנות

  • איך לתקשר בין חלקים שונים של תוכנה ב-C# wpf?
    pcinfogmachP pcinfogmach

    מצאתי כתבה שבעצם מתארת את הבעיה בצורה יפה ומציעה פתרון שלכאורה אפשר ליישם ב-c#
    הייתי שמח לשמוע אם זה הכוון הנכון

    https://betulnecanli.medium.com/how-to-pass-data-between-viewmodels-f8be320de7ab

    תכנות

  • איך לתקשר בין חלקים שונים של תוכנה ב-C# wpf?
    pcinfogmachP pcinfogmach

    @קומפיונט
    לא כל כך הבנתי את הפתרון שלך אסביר:
    נגיד יש לי viewmodel א' שבו יש נתונים מה-db ויש לי את ה-viewmodel ב' שהוא אחראי על נתונים אחרים אבל שקשורים בעקיפין ל-נתונים ב-viewmodel א'
    אני רוצה ליידע את viewmodel ב' כאשר הנתונים ב-viewmodel א' משתנים. איך אני עושה זאת?

    אגב תודה על ההערה החשובה עם ה-dependencyproperties עשית לי מוטיבציה ללמוד על הנושא.

    תכנות

  • תוכנה לאנשי קשר
    pcinfogmachP pcinfogmach

    @שוקי-הרשלר
    נשמע שאתה מחפש משהו מאוד ספיציפי אולי תפרט קצת יותר מה אתה מחפש

    תוכנה

  • איך לתקשר בין חלקים שונים של תוכנה ב-C# wpf?
    pcinfogmachP pcinfogmach

    יש לי שני חלקים בתוכנה

    1. פקד שאחראי להציג מידע מתוך db
    2. פקד שאחראי להציג מידע שקשור למידע בפקד א' אבל רק בצורה עקיפה

    מה בעצם הצורה הכי טובה לעשות את הקוד שמגשר ביניהם

    מה שעולה לי בראש לבינתיים הם כמה אפשרויות

    1. ליצור ViewModel שיקושר לשני הפקדים.
    2. שימוש ב-delgates ו-events
    3. שימוש באירועים ולהעביר instance של פקד א' לפקד ב' או הפוך
    4. ראיתי מישהו שכתב להשתמש ב-Dependency Properties (אין לי מושג מה זה).

    עד היום כמתכנת מתחיל התשמשתי עם אפשרות 3. כעת אני שוקל את הדברים מחדש.
    אשמח לשמוע מהמומחים. תודה מראש.

    תכנות

  • איך להסיר ניקוד וטעמים מטקסט בc#
    pcinfogmachP pcinfogmach

    @dovid
    פשוט אין מילים!
    אפשר לשאול איך עשית את הבדיקות? זה נראה שהתשמשת באיזשהו תוכנה לא visual studio

    כמו"כ אפשר לשאול למה בעצם על ידי string builder הוא הכי מהיר מכולם?

    תכנות

  • מדריך בסיסי עבור מנוע החיפוש הפופולרי lucene ב-C#
    pcinfogmachP pcinfogmach

    Lucene .NET היא ספרייה המשמשת ליצירת מנועי חיפוש חזקים ויעילים בתוך התוכנה שלכם.
    הקודים דלהלן נכתבו מתוך נסיון ולכן גם במקום שנראה לכם שלא צריך לעשות כמו שאמרתי תשקלו זאת פעמיים או יותר טוב תשאלו למה עשיתי ככה.

    כדי להשתמש בספרייה זו תצטרכו להתקין דרך ממשק ה-nuget ב-Visual Studio כמה ספריות. הספרייה הנוכחית של Lucene עדיין בשלבי בטא ולכן תצטרכו לסמן בחלונית ה-nuget את האפשרות "Include prerelease".

    להלן הספריות שתצטרכו:

    Lucene.Net
    Lucene.Net.QueryParser
    

    שלב א' - יצירת analyzer

    כל מנוע חיפוש בנוי על אינדקס, כלומר הוא מפרק את הטקסט לחלקים ובונה לעצמו אינדקס בו רשום היכן כל מילה נמצאת. Lucene משתמש במחלקה שנקראת Analyzer בכדי לפרק את הטקסט.

    לכן, שלב ראשון עלינו לייצר Analyzer:

    Analyzer analyzer = new StandardAnalyzer(LuceneVersion.LUCENE_48);
    

    בגרסה 4.8 הפירוק גם בעברית נעשה בצורה טובה. אם אתם רוצים משהו יותר מתקדם תוכלו לנסות את HebMorph, אבל הוא לא מעודכן לגרסה הנוכחית של Lucene ולכן במדריך זה לא נתמקד בו.

    אם ברצונכם לתמוך בחיפוש גם בטקסט מנוקד תצטרכו לייצר analyzer משלכם שמסיר את הניקוד כדלהלן:

    public class DiacriticsAnalyzer : Analyzer
    {
        LuceneVersion version;
        public DiacriticsAnalyzer(LuceneVersion luceneVersion)
        {
            version = luceneVersion;
        }
        protected override TokenStreamComponents CreateComponents(string fieldName, TextReader reader)
        {
            var tokenizer = new StandardTokenizer(version, reader);
            TokenStream filter = new HebrewTokenFilter(tokenizer);
            filter = new LowerCaseFilter(version, filter);
            filter = new StopFilter(version, filter, StopAnalyzer.ENGLISH_STOP_WORDS_SET);
            return new TokenStreamComponents(tokenizer, filter);
        }
    
        sealed class HebrewTokenFilter : TokenFilter
        {
            private readonly ICharTermAttribute termAttr;
    
            public HebrewTokenFilter(TokenStream input) : base(input)
            {
                this.termAttr = AddAttribute<ICharTermAttribute>();
            }
    
            public sealed override bool IncrementToken()
            {
                if (m_input.IncrementToken())
                {
                    string token = termAttr.ToString();
                    string cleanedToken = Regex.Replace(token, @"\p{M}", "");
    
                    if (!string.Equals(token, cleanedToken))
                    {
                        termAttr.SetEmpty().Append(cleanedToken);
                    }
    
                    return true;
                }
                return false;
            }
        }
    }
    

    אפשר להוסיף עוד פונצינליות ל-analyzer כמו פתיחת ראשי תיבות או מילים נרדפות. כאן תוכלו למצוא דוגמא מיושמת כמו"כ הכותב שם יצר תוכנה קטנה שמציגה איך analyzer עובד.


    שלב ב' - יצירת האינדקס

    להלן קוד דוגמא ליצירת אינדקס מתוך מערך של קבצי טקסט

    public void IndexFiles(List<string> files)
    {
        using (var directory = FSDirectory.Open(new DirectoryInfo(indexPath)))
        {
            var indexConfig = new IndexWriterConfig(LuceneVersion.LUCENE_48, analyzer);
            using (var writer = new IndexWriter(directory, indexConfig))
            {
                foreach (string file in files)
                {
                    string content = File.ReadAllText(file);
                    var doc = new Document
                    {
                        new StringField("Path", file, Field.Store.YES),
                        new TextField("Content", content, Field.Store.YES)
                    };
                  
                    var term = new Term("Path", file); // Create a term to search for the existing document by its path
    
                    writer.UpdateDocument(term, doc);  // Update the document if it exists, otherwise add it
                }
    
                writer.Flush(triggerMerge: true, applyAllDeletes: true);
            }
        }
    }
    
    מאוד חשוב להקפיד על ה-using כדי למנוע מצב בו האינדקס נשאר נעול במצב כתיבה.

    כדי למחוק קבצים מהאינדקס תוכלו להתמש עם הקוד דלהלן:

     public void RemoveFiles(List<string> files)
     {
         using (var directory = FSDirectory.Open(new DirectoryInfo(indexPath)))
         {
             var indexConfig = new IndexWriterConfig(Lucene.Net.Util.LuceneVersion.LUCENE_48, analyzer);
             using (var writer = new IndexWriter(directory, indexConfig))
             {
                 var parser = new QueryParser(Lucene.Net.Util.LuceneVersion.LUCENE_48, "Path", analyzer);
    
                 foreach (string file in files)
                 {
                     Query query = parser.Parse(file);
                     writer.DeleteDocuments(query);
                 }
                 writer.Flush(triggerMerge: false, applyAllDeletes: false);
             }
         }
     }
    

    שלב ג' חיפוש באינדקס

    כדי לחפש באינדקס קודם כל תצטרכו ליישם QueryParser אשר תפקידו לעשות parsing למחרוזת הטקסט של החיפוש.
    ישנם כמה וכמה סוגים של QueryParsers תלוי מאוד מה הצורך שלכם תוכלו לקרוא על כך בהרחבה בלינק שהבאתי בתחלילת הפוסט, עבור חיפוש עם אפשרויות מגוונות אני ממליץ לכם להתשמש עם ComplexPhraseQueryParser מה שיאפשר למשתמש אפשרויות חיפוש מגווונות כגון חיפוש טבלאי וחיפוש עם wildcards חיפוש מטושטש ועוד ועוד. תוכלו לקרוא על הסינטקס של חיפוש lucene בקישור שבתחילת הפוסט.

     Analyzer analyzer = new StandardAnalyzer(LuceneVersion.LUCENE_48);
    ComplexPhraseQueryParser queryParser = new ComplexPhraseQueryParser(LuceneVersion.LUCENE_48, "Content", analyzer);
    

    שימו לב! חיפוש מילה עם ראשי תיבות יחזיר שגיאה יש להזין את הראשי תיבות בתוספת slash ככה

    אא\"כ
    

    כעת תוכלו לערוך חיפוש עם ה-QueryParser. בדוגמא דלהלן החיפוש מחזיר את שדה השמות של הקבצים שנמצאו תואמים מתוך האינדקס.

      public List<string> Search(string queryText, List<string> checkedTreeNodes)
      {
          using (var directory = FSDirectory.Open(new DirectoryInfo(indexPath)))
          {
              var searcher = new IndexSearcher(DirectoryReader.Open(directory));
              var parser = new CostumeQueryParser(Lucene.Net.Util.LuceneVersion.LUCENE_48, "Content", analyzer);
    
              var query = parser.Parse(queryText);
    
              var topDocs = searcher.Search(query, int.MaxValue);
    
              List<string> results = new List<string>();
              foreach (var scoreDoc in topDocs.ScoreDocs)
              {
                  var path = searcher.Doc(scoreDoc.Doc).Get("Path");
                  results.Add(path);
              }
              return results;
          }
      }
    

    שלב ג' -2 איך לייצר גזירים

    כדי לייצר גזירים תצטרכו להתקין את חבילת ה-nuget
    Lucene.Net.Highlighter

    לאחמ"כ תוכלו להשתמש עם הקוד הזה

     string[] GetFragments(int docId, IndexSearcher searcher,  Query query)
     {
    
    //create fragmenter
         var reader = searcher.IndexReader;  
         var scorer = new QueryScorer(query);
         var fragmenter = new SimpleSpanFragmenter(scorer, 250); // 250 is the fragment size 
    
    // create highlighter
         var formatter = new SimpleHTMLFormatter("<", ">"); //define how to mark found keywords if left empty <b> tags is the default
         var highlighter = new Highlighter(formatter, scorer);         
         highlighter.TextFragmenter = fragmenter;
    
    //extract snippets
         var content = searcher.Doc(docId).Get("Content");
         var tokenStream = TokenSources.GetAnyTokenStream(reader, docId, "Content", analyzer);
         var fragments = highlighter.GetBestTextFragments(tokenStream, content, false, 10); // 10 is the number of snippets
    
    // return filters the list and converts to string filtering is needed only if number of fragments is set to more then 1
         return fragments.Where(fragment => fragment.Score > 0).Select(fragment =>  fragment.ToString()).ToList().ToArray();
     }
    

    הקוד הזה מקבל שלוש משתנים מפונציית החיפוש שהבאנו למעלה. פונקציית החיפוש בעצם מזהה אלו מסמכים מכילים את טקסט החיפוש ומחזירה רשימה של מספר הזיהוי של כל מסמך שיש בו תוצאה תואמת
    הקוד של הגזירים מקבל את מספר הזיהוי של המסמך שקבילנו בתוצאות + השאילתא שהתשמשנו בה + הגדרות השאילתא

    תכנות
  • 1 / 1
  • התחברות

  • אין לך חשבון עדיין? הרשמה

  • התחברו או הירשמו כדי לחפש.
  • פוסט ראשון
    פוסט אחרון
0
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום