Frage

Dies ist mein aktueller Code, der eine Multifield -Abfrage ausführt

       ''# Variables used by Lucene
        Dim reader As IndexReader = IndexReader.Open(luceneDirectory, True)
        Dim searcher As IndexSearcher = New IndexSearcher(reader)
        Dim parser As QueryParser = New MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_29,
                                                              New String() {"title",
                                                                            "description",
                                                                            "region",
                                                                            "pricelow",
                                                                            "pricehigh",
                                                                            "url",
                                                                            "user",
                                                                            "location"},
                                                                        New StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29))
        Dim query As Query = parser.Parse(search.ToLower)


        ''# We want to ensure that only relevant dates are being returned.
        Dim nowValue = DateTools.DateToString(DateTime.Now, DateTools.Resolution.DAY)
        Dim dateFilter = If(searchPast, Nothing, FieldCacheRangeFilter.NewStringRange("filterdate",
                                                                                  lowerVal:=nowValue,
                                                                                  includeLower:=True,
                                                                                  upperVal:=Nothing,
                                                                                  includeUpper:=False))


''#============================================================================
''# Here's where I also need to add a regionFilter where I have something like

''# Dim regionFilter = New FieldCacheTermsFilter("region", New String() {HttpContext.Current.Request.Url.Subdomain})

''# This is because we must always ONLY ever return search results that are from
''# HttpContext.Current.Request.Url.Subdomain (where Subdomain is an extension 
''# method that returns the name of the region... much like Kijiji.ca)
''#============================================================================

        Dim topDocs As TopDocs = searcher.Search(query, dateFilter, 1000)

Ich bin mir einfach nicht sicher, wie ich das machen soll. Wie kann ich es ändern, damit ich eine boolesche Abfrage durchführen und einen zweiten Filter einfügen kann?

Hinweis: Ich muss noch in der Lage sein, auf Feldern wie wie zu suchen

Benutzer: Benutzername
Ort: Deutschland
etc

Ich habe zuvor eine streng Boolesche Abfrage ausprobiert und konnte die obigen Suchbegriffe nicht verwenden. Ich bin mir nicht sicher, wo ich falsch gelaufen bin.

War es hilfreich?

Lösung

Es scheint, als ob die Antwort so aussieht

    ''# Variables used by Lucene
    Dim reader As IndexReader = IndexReader.Open(luceneDirectory, True)
    Dim searcher As IndexSearcher = New IndexSearcher(reader)
    Dim parser As QueryParser = New MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_29,
                                                          New String() {"title",
                                                                        "description",
                                                                        "region",
                                                                        "pricelow",
                                                                        "pricehigh",
                                                                        "url",
                                                                        "user",
                                                                        "location"},
                                                                    New StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29))
    Dim query As Query = parser.Parse(search.ToLower)

    Dim nowValue = DateTools.DateToString(DateTime.Now, DateTools.Resolution.DAY)
    Dim dateFilter = If(searchPast, Nothing, FieldCacheRangeFilter.NewStringRange("filterdate",
                                                                                  lowerVal:=nowValue,
                                                                                  includeLower:=True,
                                                                                  upperVal:=Nothing,
                                                                                  includeUpper:=False))


        ''# Here's where the extra filtering magic happens
        ''# First we add the original query to the boolean query
        ''# Then we add another "MUST" query that says that region has to = Subdomain
        Dim bquery = New BooleanQuery
        bquery.Add(query, BooleanClause.Occur.MUST)
        bquery.Add(New TermQuery(New Term("region", HttpContext.Current.Request.Url.Subdomain)), BooleanClause.Occur.MUST)

        Dim topDocs As TopDocs = searcher.Search(bquery, dateFilter, 1000)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top