Quantcast
Channel: Optimizely Search & Navigation
Viewing all 6894 articles
Browse latest View live

Search query to find a word thats could be in inside multiple properties

$
0
0

I have three properties 

  • First name
  • Last name
  • Username

User can search for a word that can be in all three properties. I have had this two queries to achieve the desired result

searchTermFilters = searchTermFilters
    .For(term)
    .InFields(x => x.Firstname, x => x.Surname, x => x.Username);
searchTermFilters = searchTermFilters
                .OrFilter(x => x.Firstname.AnyWordBeginsWith(term))
                .OrFilter(x => x.Surname.AnyWordBeginsWith(term))
                .OrFilter(x => x.Username.AnyWordBeginsWith(term));

The issue is that for both of them it matches exactly. I want something like .Contains in Linq. Any insights?


Inconsistent results with FilterForVisitor()

$
0
0

Hello,

We have been using the same code for many months to search for products in our catalog. Recently though we started having issues where the same search query would produce different results. Sometimes the results are correct, but a lot of the time they are wrong as the results do not include products that should be there. This happens both through our production and dev indexes. I went through our code and setup some tests and found out that FilterForVisitor() was causing the issues. Once I took that out, the results became consistent, but we need this because, as I have read, it filters out unpublished products.

I am not sure what might have changed in our environments to cause FilterForVisitor() to stop working, but any guidance would be highly appreaciated.

Thanks

Filtering on nested objects/properties

$
0
0

Hi,

I have problem where I need to be able to filter on properties on subpages but return the parent page from FIND. I thought that I could use nested queries for this but i does not seem to work.

Page structure is as follows:

Education page 1 (info)

      -Event page 1 (Event)

      -Event page 2 (Event)

      -Event page 3 (Event)

Education page 2 (info)

      -Event page 1 (Event)

      -Event page 2 (Event)

etc

and the page types look like this (generalised):

public class Education
{ public Education(string name) {  Events = getChildren<Event>(this.contentID); } public string Name { get; set; } public string SokSemesters { get; set; } public string SokLocations { get; set; } public string SokTerms { get; set; } public List<Event> Event { get; set; } //Nested object
}
public class Event
{  public string Semester { get; set; }  public string Location { get; set; }  public string Term { get; set; }
}


I index both Education and Event pages and have access to them from FIND. I search over the Education type because I want to present educations in the search result (with events) and in filter options with count over how many educations each filter options result in (using facetts). The SokSemesters, SokLocations and SokTerms are a actually just collections(comma separated string) of corresponding properties on all the events that belong to a certain education. I use SokSemesters, SokLocations and SokTerms to generate the facetts.

Now to the tricky part. I want to be able filter on semester, location and term on the events and only returning matching educations. Between different types of filters AND should be used and within the same type of filter OR should be used (you can have multiple filters of the same type). I have tried something like this:

.Filter (X => x.Events, x => x.Location.MatchCaseInsensitive (Location);

But it does not seem to work, it does not filter educations correctly. So I am wondering if I am missing something about nested queries? Or is there any other way of doing this, for example by using a content area and putting the events there?

Thanks

Magnus

Episerver Find.js replacing the entire window.onload event

$
0
0

Hi,

I don't know if this is the right place to report this for Episerver.Find.

Somewhere earlier in my HTML page, I have a script that attaches a handler to the window.load event

window.onload = function() {}

However this is not being triggered because somewhere lower on the page, there is a find.js (https://dl.episerver.net/12.4.3/epi-util/find.js) that completely replaces the window.load instead of attaching another event handler to the window.load and it is this particular snippet:

 this.bindWindowEvents = function() {
        var t = this;
        window.history && (window.onbeforeunload = function() {
            var e = document.location.href;
            e.indexOf("q=") > 0 && -1 == e.indexOf(t._dontTrackQueryParam + "=") && window.history.replaceState(window.history.state, window.document.title, e + (e.indexOf("?") > 0 ? "&" : "?") + t._dontTrackQueryParam + "=true")
        }
        ),
        window.onload = function() {
            var e = t._toArray(document.getElementsByTagName("A"))
              , r = document.createElement("A");
            r.href = document.location.href;
            for (var n = 0; e.length > n; n++) {
                var a = function() {
                    var a = e[n].href
                      , i = t._getTrackQueryParamsFromUrl(a);
                    if (i.trackQueryParams.length > 0) {
                        var o = document.createElement("A");
                        o.href = a,
                        ("/" != t._applicationUrl && r.hostname + t._applicationUrl != o.hostname + "/" + o.pathname.split("/")[1] + "/" || "/" === t._applicationUrl && r.hostname != o.hostname) && (e[n].href = t._serviceApiBaseUrl + "_click?" + t._trackParam + i.trackQueryParams.join("&" + t._trackParam) + "&" + t._trackParam + "redirect=" + encodeURIComponent(t._getUriWithoutTrackParams(a, i)))
                    }
                };
                a()
            }
        }
    }

Can we request for the window.onload to be something like this?

window.addEventListener("load", epiFindFunctionHere, false);

So it doesn't erase any event handlers already attached?

Thanks

UnifiedSearch yields no results in WebApi

$
0
0

Ok, this is pretty weird. When executing unified search in page controller context - it's working as expected (sample code):

 

public class SearchPageController : PageControllerBase<SearchPage>
{
    public ViewResult Index(SearchPage currentPage, string q)
    {
        var ctrl = new SearchController();
        var results = ctrl.Search(new SearchRequest { Query = q, PageSize = currentPage.ResultsCount });
        return View(new SearchPageViewModel(currentPage, q, results));
    }
}

    

WebApi controller:

public class SearchController : ApiController
{
    [HttpGet]
    public UnifiedSearchResults Search([FromUri] SearchRequest request)
    {
        var hitSpec = new HitSpecification
                      {
                          HighlightExcerpt = true,
                          ExcerptLength = 250,
                          PreTagForAllHighlights = "<strong><em>",
                          PostTagForAllHighlights = "</em></strong>"
                      };
        var results = SearchClient.Instance.UnifiedSearchFor(request.Query)
            .TermsFacetFor(p => p.SearchSection)
            .Skip(request.Page * request.PageSize)
            .Take(request.PageSize)
            .GetResult(hitSpec);
        return results;
    }
}

    

 

When accessing WebApi directly from client-side the same method it yields zero results (SearchRequest parameter in WebApi *is* binded correctly):

$.getJSON('/Api/Search/Search', { Query: q.val(), Page: 1, PageSize: 10 }, function (data) {
    alert(data);
});

    

Epi Find unified search "two page headers" problem

$
0
0

Hello!

We are running unified search with episerver find version 12.4.1.

We have pages with two different "headers". The first one is the default episerver name for Page "PageName".

The other header is a Property on the PageBase Abstract class named "Title".

The functionality we want is the following:

If "Title" exists show that in the Search Result for "SearchTitle".

If "Title" not exist show "PageName" as "SearchTitle".

BUT both "PageName" and "Title" is searachable and boosted so it acts like a SearchTitle. 

Examples:

A page has the following values:

Scenario 1

PageName = "An advanced CMS"

Title = "About Episerver"

And you search for advanced CMS:

The title in search result will be the "About Episerver" and it will be boosted as the first hit.

If you search for About Episerver it will have standard behaviour ofcourse.

Scenario 2

PageName = "An advanced CMS"

Title = null

Search for CMS:

The title in search result will be the "An advanced CMS".

Solutions we have tried:

In PageBase have the following values:

      public string SearchTitle
      {
        get
        {
        return string.Join("",
          new string[]
          {
            Title,
            PageName
          });
      }
      }
      public string GetConditionalPageTitle()
      {
        return Title.IsNotNullOrEmpty() ? Title : PageName;
    }

And in FindInitialization module have these:

          SearchClient.Instance.Conventions.ForInstancesOf<ArticlePageBase>()
            .IncludeField(x => x.GetConditionalPageTitle());
          SearchClient.Instance.Conventions.UnifiedSearchRegistry
            .ForInstanceOf<ArticlePageBase>()
            .ProjectTitleFrom(x => x.GetConditionalPageTitle());

But it does not work. Both headers are shown in this way, and they do not get the same boost as before.

Epi find "relation" to other object in index possible?

$
0
0

Hey!

If the following is possible:

I'm using normal episerver find search (Not unified). Version: 12.5.3.0

I have a custom Index class in EpiServer find named "PersonIndexItem" which contains information name, email, address and other information about a user.

I also have a Custom Index for Schools named "SchoolIndexItem". The school have a principal. When i search for a school and get a hit i would like to display information about the school and also show information about the principal with the exact information as a "PersonIndexItem" hit. I wonder if it is possible in some way create a reference or relationship from SchoolIndexItem:Principal to PersonIndexItem. So that the Principal of the school information is always up to date.

Because the PersonIndexItem updates more frequently than the SchoolIndexItem so the SchoolIndexItem shows old information.

How do I search by fields? Something isn't working

$
0
0

I am using EpiFind, the version is 12.5.3 in NuGet.

I want to search by a few fields in the JSON below. I am trying this code, but I don't get the right results back. I don't understand why.

Snippet

var searchResult = _searchClient.Search<RemoteHostedContentItem>()    .For(filename).InField(x => x.SearchFilename).GetResult();

I want to search by

SearchSubsection
SearchFilename

But I don't know how to.
{"SearchSubsection$$string": "S-Reliability Coordination","SearchTypeName$$string": "Document","SearchFilename$$string": "RTVSA_Summary_071718_1509.html","ContentTypeName": "Hypertext Markup Language","SearchHitUrl$$string": "http://localhost:17104/api/extranetdocuments/getbyname/RTVSA_Summary_071718_1509.html","_TypeShortName": "RemoteHostedContentItem","accesstype": ["Visitors-RA"
    ],"rtvsareportanalysisfile": "Case Summary","guid": "42b1048e-8995-4e89-804d-caafb55cdb3c","SearchSection$$string": "Documents","_type": "MisoWeb_Models_Find_RemoteHostedContentItem","Files": {"original": "http://localhost:17104/api/extranetdocuments/getbyname/RTVSA_Summary_071718_1509.html"
    },"_id": "Extranet_RTVSA-448","RolesWithReadAccess$$string": ["Visitors-RA"
    ],"_TypeDisplayName": "Remote Hosted Content Item","FileName": "RTVSA_Summary_071718_1509.html","CommitteeDocType": "test","CreatedBy": "MISO.C2.RTVSA","$type": "MisoWeb.Models.Find.RemoteHostedContentItem, MisoWeb","UpdatedBy": "MISO.C2.RTVSA","DocumentType": "S-Reliability Coordination","SearchTitle$$string": "RTVSA_Summary_071718_1509.html","rctype": "RTVSA","ContentType": "text/html"
}

Another question on Searching multiple Fields

$
0
0

If I have the code below, but I want to search more than one field for given values that I KNOW, how do I do that?

            var searchRequest = new EPiServer.Find.Api.SearchRequestBody
            {
                Size = 1,
                From = 0,
                Query = new EPiServer.Find.Api.Querying.Queries.FieldQuery("SearchFilename$$string",filename)
            };
            var searchHits = client.Search<RemoteHostedContentItem>(searchRequest, command => { });

Sorting Issue when sorting by date

$
0
0

We are experiencing alot of issues with with orderby in our results.  Especially happening with Dates and strings.  The order by on a property Title for example puts abdominal at the end of the list and shows adolecent as the first item.  Clearly not working.  Another instance is the date.

Here is the result of 7 events sorted by date

7/26/2018 6:15:00 PM
9/10/2018 9:00:00 AM
10/27/2018 8:30:00 AM
7/28/2018 9:00:00 AM
11/2/2018 7:30:00 AM
11/29/2018 8:00:00 AM
7/22/2018 9:00:00 AM
Here is the code.
            var query = this.searchClient.Search<EventPage>();
            if (q.HasValue())
                query = query.For(q);
            if (currentPage.EventTypes.HasValue())
            {
                var eventTypeFilter = this.searchClient.BuildFilter<EventPage>();
                foreach (var eventType in currentPage.EventTypes.Select(x => x.ToReferenceWithoutVersion().ID))
                    eventTypeFilter = eventTypeFilter.Or(x => x.EventTypeIdList.Match(eventType));
                query = query.Filter(eventTypeFilter);
            }
            if (currentPage.ScopeOverride.HasValue())
                query = query.Filter(x => x.Ancestors().Match(currentPage.ScopeOverride.ToReferenceWithoutVersion().ID.ToString()));
            query = query
                .FilterForVisitor()
                .ExcludeDeleted()
                .Filter(x => x.EndDateTime.GreaterThan(DateTime.Now))
                .OrderBy(x => x.StartDateTime)
                .Skip(model.PageWeight * p)
                .Take(model.PageWeight);
            var results = query.GetContentResult();

We are using version 13.0.1.0

EpiFind: search only on parents children

$
0
0

Hi!

I am trying to make a search result, with Find, with rsults only from currentpage and its children. I would like somthing like FilterOnCurrentSite() but for only currentpage and its children. Does anyone know hos I can do this?

Code:

search = search
.ExcludeDeleted()
.CurrentlyPublished()
.FilterOnCurrentSite()
.TermsFacetFor(arr => arr.MainL, facetRequest =>
{
facetRequest.AllTerms = true;
facetRequest.Size = MaxFacets;
})
.TermsFacetFor(arr => arr.CNames, facetRequest =>
{
facetRequest.AllTerms = true;
facetRequest.Size = MaxFacets;
});

Filter pages by specific page types and categories

$
0
0

I'm trying to get only pages matching with specific page types (article, product pages for instance) and with specific categories list using Find. I couldn't make it work as per the samples available online. 

My questions are how are restrict the search to find only specific pages by matching specific page types and categories list. if any page type matches with more than one categories then search result should return one rather than returning same page type twice. 

Much appreciated if some one could please help me on this ?

Thanks,

Suresh 

GDPR and EPiFind Tracking

$
0
0

We've been asked some questions about the tracking that is used when enabling statistics in EPiFind:

/page/in/searchresults/?_t_id=<ID>&_t_q=<mysearchterm>&_t_tags=langu-age:sv,siteid:<guid>&_t_ip=<XX.XX.XX.XX>&_t_hit.id=<NameSpace>/_68d3ab17-d83c-4f64-ae14-288a48d3ffd0_sv&_t_hit.pos=2

These are visible on links in the search results whenever we enable the Track clicking:

SearchClient.Instance.Statistics().TrackQuery(...)
SearchClient.Instance.Statistics().TrackHit(...)

The main issue here is the namespace and the IP-adress which can, contain sensitive information and our customer asked us to remove at least the IP-address. But this will break the tracking.

Can we send the trackingdata on the backend side in some programatic way so we can keep the URL clean? One idea was to make an async call to the above URL after user clicked but wondered if there was a more elegant way?

FilterBuilder question matching comma seperated string with a list

$
0
0

Hi guys,

my problem:

i have a checkbox property on a catalogitem. 

public class TippingProduct : BaseProductContent
    {        
        [EnumMany(typeof(TippingFrontEndCylinderHeadboardType))]        
        [Display(Order = 8,
            Name = "Headboard Type",
            GroupName = Logic.Constants.TabNames.Filters,
            Description = "Filter Headboard Type - Frontend Cylinder")]        
        public virtual string HeadboardType { get; set; }
}

the enum looks like this:

 public enum TippingFrontEndCylinderHeadboardType
    {
        Slanted,
        Straight
    }

now i want to filter on headboardtype

public static dynamic TippingProducts(TippingSearchData tippingSearchData)
        {
            IClient client = SearchClient.Instance;
            //start of the query
            var query = client.Search<TippingProduct>()
                .FilterForVisitor()
                .Filter(x => x.ShowInList.Match(true));
            //selected headboard type
            if (tippingSearchData.Headboard != null && tippingSearchData.Headboard.Any())
            {
                query = query.Filter(x => GetHeadBoardFilter(tippingSearchData.Headboard));
            }
            var res = query.GetContentResult();
            return new
            {
                items = res.Count()
           };
        }
private static FilterBuilder<TippingProduct> GetHeadBoardFilter(List<TippingFrontEndCylinderHeadboardType> headboards)
        {
            var filter = SearchClient.Instance.BuildFilter<TippingProduct>();
           // return headboards.Aggregate(filter, (current, headboard) => current.Or(x => x.HeadboardType.Match(headboard.ToString())));
            foreach (var headboard in headboards)
            {
                filter = filter.Or(tp => tp.HeadboardType.Split(',').Match(headboard.ToString()));
            }
            return filter;
        }

So the property HeadBoardType of my TippingProduct saves the data as comma seperated string. 

When searching using epifind i sent a List<TippingFrontEndCylinderHeavyDuty> headboards and want a filter on all my TippingProduct pages where the HeadBoardType property contains one of the items from the list. 

You can see in my filter builder i had a aggregate uncommented. So that works good if each TippingProduct only has 1 checkbox selected, because then its not a comma seperated string. But once 1 tipping product has 2 checkboxes selected then that one is not found. Which is logical because it will not match. But my second approach trying to split and then check doesnt work either. So i must be missing something trivial here. 

Fragmented sorting issue

$
0
0

Hi, I have a strange problem ocuring when I try to use OrderBy for any given propery: The ordering is fragmented.

What I mean by that is if I OrderBy on number I get something like: 1, 2, 5, 6, 3, 4, 7, 8, 0 and then 6, 5, 2, 1, 8, 7, 4, 3, 0 for descending. It seams like the result is getting orderd by something else before ordering on the number, but I have triple-checked the request and there is only one sort object in the sort array.

query.OrderBy(arg => arg.Code);

Gives: 

    [0]: "22565423125"
    [1]: "22565423216"
    [2]: "22565423236"
    [3]: "22565423294"
    [4]: "22565423130"
    [5]: "22565423140"
    [6]: "22565423291"
    [7]: "22565423297"
    [8]: "22565423614"
    [9]: "22565423622"
    [10]: "22565423627"
    [11]: "22565423647"
    [12]: "22565423231"
    [13]: "22565423285"
    [14]: "22565423637"
    [15]: "22565423642"
    [16]: "22565423120"
    [17]: "22565423221"
    [18]: "22565423226"
    [19]: "22565423288"
    [20]: "22565423300"
    [21]: "22565423135"
    [22]: "22565423211"
    [23]: "22565423652"

And 

query.OrderByDescending(arg => arg.Code);

Gives: 

    [0]: "22565423236"
    [1]: "22565423216"
    [2]: "22565423125"
    [3]: "22565423115"
    [4]: "22565423647"
    [5]: "22565423627"
    [6]: "22565423622"
    [7]: "22565423614"
    [8]: "22565423297"
    [9]: "22565423291"
    [10]: "22565423140"
    [11]: "22565423130"
    [12]: "22565423642"
    [13]: "22565423637"
    [14]: "22565423285"
    [15]: "22565423231"
    [16]: "22565423300"
    [17]: "22565423288"
    [18]: "22565423226"
    [19]: "22565423221"
    [20]: "22565423120"
    [21]: "22565423652"
    [22]: "22565423632"
    [23]: "22565423135"

I have tried switching indexes and still the issue remains.

I'm using Episerver.Find 13.0.1.


Issues with new developer indexes

$
0
0

Are there issues with newly created developer indexes? I receive "(401) Unauthorized" errors when indexing and also received nested "IOException[No space left on device]" while indexing last Friday. I have an old index that works just fine on the very same project. I'm confident I have the correct configuration using the correct private url.

Unified Search - Statistics Tracking results in error

$
0
0

Hi,

I am using Unified Search and I want it to appear in the Statistics, so added the Track() method.

IEnumerable _SearchResults = searchClient.UnifiedSearch().For(queryString)
.InField(x => ((BasePageData)x).MetaKeywords)
.InField(x => ((BasePageData)x).MetaTitle)
.InField(x => ((BasePageData)x).MetaDescription)
.Track()
.Filter(x => !x.MatchTypeHierarchy(typeof(ImageData))).Filter(y => !y.MatchTypeHierarchy(typeof(ContainerPage)))
.Take(10).Skip((p - 1) * 10).GetResult(hitSpec, false);

The GetResult method in above statement throws exception "String reference not set to an instance of a String.\r\nParameter name: s"

Stacktrace: 

   at System.Text.Encoding.GetBytes(String s)
   at EPiServer.Find.TrackContext.HashString(String toHash)
   at EPiServer.Find.TrackContext..ctor()
   at EPiServer.Find.SearchExtensions.GetProjectedResult[TResult](ISearch`1 search, SearchContext context)
   at EPiServer.Find.SearchExtensions.GetResult(ITypeSearch`1 search, HitSpecification hitSpecification, Boolean filterForPublicSearch)
   at Trisept.Vax.Epi.ContentSite.Controllers.SearchController.PopulateViewModel(String queryString, VaxBasePageData currentPage, Int32 p) in C:\TFS\Trisept.VAX.Content\Development\Trisept.Vax.Epi\Trisept.Vax.Epi.ContentSite\Controllers\SearchController.cs:line 56
   at Trisept.Vax.Epi.ContentSite.Controllers.SearchController.Index(Nullable`1 p) in C:\TFS\Trisept.VAX.Content\Development\Trisept.Vax.Epi\Trisept.Vax.Epi.ContentSite\Controllers\SearchController.cs:line 40
   at lambda_method(Closure , ControllerBase , Object[] )
   at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
   at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.b__3d()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass46.b__3f()

If I remove the Track() method, it works fine.

But I need to gather the statistics. Can't figure what I am doing wrong. Please help.

Thank you.

----- Update -----

The above issue occurs only when I am logged in via SAML authenticated user.

Both search and statistics work fine when the user is Epi admin

Working with Find in Ektron

$
0
0

The documention for Episerver Find and Ektron is lacking.  I'm using the only full sample code I've found https://support.episerver.com/hc/en-us/articles/115004126086-Using-EPiServer-s-Find-search-With-Ektron and our index is returing everything.  We have a lot of smartforms and content blocks that we use as helpers that we dont' want in search results. For example, we have a configuration smartform that doesn't need to be indexed but we have new release smart forms that DO need to be indexed.  I can not find any examples as to how to go about doing this.

Anybody have any experence with Find in Ektron who can help me out?   

XhtmlString deserialization issue

$
0
0

Hi 

I am having an issue when calling GetResult from the search query, the XhtmlString element always return null. I have checked data in the Explorer, it's there. 

"Description": {"$type": "EPiServer.Core.XhtmlString, EPiServer","AsViewedByAnonymous$$string": "Size: Bath Towel - 70 x 140cm Hand - 45 x 65cm Bath Sheet - 80 x 160cm GSM: 550","___types": ["EPiServer.Core.XhtmlString","System.Object","System.Web.IHtmlString","System.Runtime.Serialization.ISerializable","EPiServer.Data.Entity.IReadOnly`1[[EPiServer.Core.XhtmlString, EPiServer, Version=9.6.0.0, Culture=neutral, PublicKeyToken=8fe83dea738b45b7]]","EPiServer.Data.Entity.IReadOnly"
        ],"IsEmpty$$bool": false,"IsModified$$bool": false
    },

I am using the latest EPi find (v11) with EPiCommerce 9.6

EpiFind: search only on parents children

$
0
0

Hi!

I am trying to make a search result, with Find, with rsults only from currentpage and its children. I would like somthing like FilterOnCurrentSite() but for only currentpage and its children. Does anyone know hos I can do this?

Code:

search = search
.ExcludeDeleted()
.CurrentlyPublished()
.FilterOnCurrentSite()
.TermsFacetFor(arr => arr.MainL, facetRequest =>
{
facetRequest.AllTerms = true;
facetRequest.Size = MaxFacets;
})
.TermsFacetFor(arr => arr.CNames, facetRequest =>
{
facetRequest.AllTerms = true;
facetRequest.Size = MaxFacets;
});

Viewing all 6894 articles
Browse latest View live